スコット・マイヤーズの本の項目18効果的な STL: 標準テンプレート ライブラリの使用を改善するための 50 の具体的な方法vector <bool>
これは STL コンテナーではなく、実際には s を保持しないため、避けるように指示されていますbool
。
次のコード:
vector <bool> v;
bool *pb =&v[0];
コンパイルされず、STL コンテナの要件に違反します。
エラー:
cannot convert 'std::vector<bool>::reference* {aka std::_Bit_reference*}' to 'bool*' in initialization
vector<T>::operator []
戻り値の型は であるはずですT&
が、 の場合はなぜ特別なケースになるのでしょうかvector<bool>
?
実際には何vector<bool>
から構成されているのでしょうか?
アイテムにはさらにこう書かれています。
deque<bool> v; // is a STL container and it really contains bools
これを の代替として使用できますかvector<bool>
?
誰かこれを説明してくれませんか?
ベストアンサー1
スペースの最適化のため、C++ 標準 (C++98 まで遡る) では、vector<bool>
各 bool が通常の bool のように 1 バイトではなく 1 ビットのスペースのみを使用する特別な標準コンテナーを明示的に呼び出します (一種の「動的ビットセット」を実装)。この最適化と引き換えに、通常の標準コンテナーのすべての機能とインターフェイスは提供されません。
この場合、バイト内のビットのアドレスを取得できないため、 などはoperator[]
を返すことはできませんbool&
が、代わりに問題の特定のビットを操作できるプロキシ オブジェクトを返します。このプロキシ オブジェクトは ではないためbool&
、このような演算子を「通常の」コンテナで呼び出した場合のように、そのアドレスを に割り当てることはできませんbool*
。つまり、 はbool *pb =&v[0];
有効なコードではないということです。
一方、 にはdeque
そのような特殊化が呼び出されていないため、各 bool は 1 バイトを取得し、 から返される値のアドレスを取得できますoperator[]
。
最後に、MS 標準ライブラリの実装は、deque に小さなチャンク サイズを使用するという点で (おそらく) 最適ではないことに注意してください。つまり、deque を代わりに使用することが常に正しい答えであるとは限りません。