なぜベクトルではないのか STLコンテナ?質問する

なぜベクトルではないのか STLコンテナ?質問する

スコット・マイヤーズの本の項目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 を代わりに使用することが常に正しい答えであるとは限りません。

おすすめ記事