[解決済み] なぜvector<bool>はSTLコンテナではないのですか?
質問
Scott Meyersの書籍の18番目の項目
Effective STL: 標準テンプレートライブラリの使い方を改善する50の具体的な方法
には、以下を避けるように書かれています。
vector <bool>
はSTLコンテナではないので避けるようにと書かれています。
bool
s.
次のようなコードです。
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>
?
どなたか解説をお願いします。
どのように解決するのですか?
スペースの最適化のため、C++ 標準では (C++98 まで) 明示的に
vector<bool>
を特別な標準コンテナーとして明示的に呼び出しており、各ブールは通常のブールのように 1 バイトではなく、1 ビットだけのスペースを使用します (一種の "dynamic bitset" を実装しています)。この最適化と引き換えに、通常の標準コンテナのすべての機能とインターフェイスを提供するわけではありません。
この場合、バイト内のビットのアドレスを取ることができないので、次のようなものがあります。
operator[]
を返すことはできません。
bool&
を返すのではなく、問題のある特定のビットを操作することができる プロキシオブジェクトを返します。このプロキシオブジェクトは
bool&
ではありませんので、そのアドレスを
bool*
にアドレスを割り当てることができません。これは、順番に、以下のことを意味します。
bool *pb =&v[0];
は有効なコードではないことを意味します。
一方
deque
はそのような特殊化を呼び出していないので、各boolはバイトを取り、そこから返される値のアドレスを取ることができます。
operator[]
.
最後に、MS 標準ライブラリの実装は、deque に小さなチャンクサイズを使用するという点で(間違いなく)最適でないことに注意してください。
関連
-
[解決済み】C++ 非推奨の文字列定数から「char*」への変換について
-
[解決済み】リンカーエラーです。"リンカ入力ファイルはリンクが行われていないため未使用"、そのファイル内の関数への未定義参照
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] 要素ごとの加算は、結合ループよりも分離ループの方がはるかに高速なのはなぜですか?
-
[解決済み] なぜC++はPythonよりもstdinからの行の読み込みが遅いのですか?
-
[解決済み] なぜテンプレートはヘッダーファイルでしか実装できないのですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] std::vectorをハードコードされた要素で初期化する最も簡単な方法は何ですか?
-
[解決済み] std::vector<> からインデックスで要素を消すにはどうしたらいいですか?
-
[解決済み】STLにおけるvectorとlistの比較
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み] error: 'ostream' does not name a type.
-
[解決済み】文字列関数で'char const*'のインスタンスを投げた後に呼び出されるterminate [閉店].
-
[解決済み】浮動小数点例外エラーが発生する: 8
-
[解決済み】「Expected '(' for function-style cast or type construction」エラーの意味とは?
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み] [Solved] インクルードファイルが開けません。'stdio.h' - Visual Studio Community 2017 - C++ Error
-
[解決済み】浮動小数点数の乱数生成
-
[解決済み] sizeof(bool)はC++言語規格で定義されていますか?