std:: vector<bool>
|
ヘッダーで定義
<vector>
|
||
|
template
<
class
Allocator
|
||
std
::
vector
<
bool
>
は、
std::vector
の
bool
型に対する、空間効率が高い可能性のある特殊化です。
std
::
vector
<
bool
>
が空間効率を実現する方法(および最適化が行われるかどうか自体)は実装定義です。1つの潜在的な最適化は、ベクター要素を統合し、各要素が
sizeof
(
bool
)
バイトではなく単一ビットを占有するようにすることです。
std
::
vector
<
bool
>
は
std::vector
と同様に動作しますが、メモリ効率を高めるために以下の特徴を持ちます:
- 必ずしもその要素を連続した配列として格納しない。
-
std
::
vector< bool > ::referenceクラスを個々のビットにアクセスする方法として公開する。特に、このクラスのオブジェクトは operator[] によって値で返される。 - std :: allocator_traits :: construct を使用してビット値を構築しない。
- 同じコンテナ内の異なる要素が異なるスレッドによって同時に変更できることを保証しない。
目次 |
メンバー型
| メンバ型 | 定義 | ||||
value_type
|
bool | ||||
allocator_type
|
Allocator
|
||||
size_type
|
実装定義 | ||||
difference_type
|
実装定義 | ||||
|
単一の
bool
への参照を表すプロキシクラス
(クラス) |
|||||
const_reference
|
bool | ||||
pointer
|
実装定義 | ||||
const_pointer
|
実装定義 | ||||
iterator
|
|
||||
const_iterator
|
|
||||
reverse_iterator
|
std:: reverse_iterator < iterator > | ||||
const_reverse_iterator
|
std:: reverse_iterator < const_iterator > |
メンバー関数
vector
を構築する
(
std::vector<T,Allocator>
の公開メンバ関数)
|
|
vectorを破棄する
vector
(
std::vector<T,Allocator>
の公開メンバー関数)
|
|
|
コンテナに値を代入する
(
std::vector<T,Allocator>
の公開メンバー関数)
|
|
|
コンテナに値を割り当てる
(
std::vector<T,Allocator>
の公開メンバー関数)
|
|
|
(C++23)
|
コンテナに値の範囲を割り当てる
(
std::vector<T,Allocator>
の公開メンバ関数)
|
|
関連付けられたアロケータを返す
(
std::vector<T,Allocator>
の公開メンバー関数)
|
|
要素アクセス |
|
|
境界チェック付きで指定された要素にアクセス
(
std::vector<T,Allocator>
の公開メンバー関数)
|
|
|
指定された要素にアクセス
(
std::vector<T,Allocator>
の公開メンバー関数)
|
|
|
最初の要素にアクセスする
(
std::vector<T,Allocator>
の公開メンバー関数)
|
|
|
最後の要素にアクセスする
(
std::vector<T,Allocator>
の公開メンバー関数)
|
|
イテレータ |
|
|
(C++11)
|
先頭を指すイテレータを返す
(
std::vector<T,Allocator>
の公開メンバ関数)
|
|
(C++11)
|
終端へのイテレータを返す
(
std::vector<T,Allocator>
の公開メンバ関数)
|
|
(C++11)
|
先頭への逆方向イテレータを返す
(
std::vector<T,Allocator>
の公開メンバ関数)
|
|
(C++11)
|
末尾を指す逆イテレータを返す
(
std::vector<T,Allocator>
の公開メンバ関数)
|
容量 |
|
|
コンテナが空かどうかをチェックする
(
std::vector<T,Allocator>
の公開メンバー関数)
|
|
|
要素数を返す
(
std::vector<T,Allocator>
の公開メンバー関数)
|
|
|
要素の最大可能数を返す
(
std::vector<T,Allocator>
の公開メンバー関数)
|
|
|
ストレージを予約
(
std::vector<T,Allocator>
の公開メンバー関数)
|
|
|
現在割り当てられているストレージに保持できる要素数を返す
(
std::vector<T,Allocator>
の公開メンバー関数)
|
|
修飾子 |
|
|
内容をクリアする
(
std::vector<T,Allocator>
の公開メンバー関数)
|
|
|
要素を挿入する
(
std::vector<T,Allocator>
の公開メンバー関数)
|
|
|
(C++23)
|
要素の範囲を挿入する
(
std::vector<T,Allocator>
の公開メンバ関数)
|
|
(C++23)
|
要素の範囲を末尾に追加する
(
std::vector<T,Allocator>
の公開メンバ関数)
|
|
(C++11)
|
要素をその場で構築する
(
std::vector<T,Allocator>
の公開メンバ関数)
|
|
要素を削除する
(
std::vector<T,Allocator>
の公開メンバー関数)
|
|
|
末尾に要素を追加
(
std::vector<T,Allocator>
の公開メンバー関数)
|
|
|
(C++11)
|
要素をその場で末尾に構築する
(
std::vector<T,Allocator>
の公開メンバ関数)
|
|
最後の要素を削除する
(
std::vector<T,Allocator>
の公開メンバ関数)
|
|
|
格納されている要素の数を変更する
(
std::vector<T,Allocator>
の公開メンバー関数)
|
|
|
内容を交換する
(
std::vector<T,Allocator>
の公開メンバー関数)
|
|
|
|
|
すべてのビットを反転する
(public member function) |
|
|
[static]
|
2つの
std::vector<bool>::
reference
を交換する
(公開静的メンバ関数) |
非メンバー関数
|
(C++20で削除)
(C++20で削除)
(C++20で削除)
(C++20で削除)
(C++20で削除)
(C++20)
|
2つの
vector
の値を辞書順で比較する
(関数テンプレート) |
|
std::swap
アルゴリズムを特殊化する
(関数テンプレート) |
|
|
特定の条件を満たすすべての要素を削除する
(関数テンプレート) |
ヘルパークラス
|
(C++11)
|
std
::
vector
<
bool
>
のハッシュサポート
(クラステンプレートの特殊化) |
推論ガイド (C++17)
注記
ビットセットのサイズがコンパイル時に既知である場合、
std::bitset
を使用することができ、より豊富なメンバー関数を提供します。さらに、
boost::dynamic_bitset
が
std
::
vector
<
bool
>
の代替として存在します。
その表現が最適化されている可能性があるため、
std
::
vector
<
bool
>
は必ずしもすべての
Container
または
SequenceContainer
要件を満たすとは限りません。例えば、
std
::
vector
<
bool
>
::
iterator
は実装定義であるため、
LegacyForwardIterator
要件を満たさない可能性があります。
LegacyForwardIterator
s
を必要とする
std::search
のようなアルゴリズムを使用すると、
コンパイル時または実行時エラー
が発生する可能性があります。
Boost.Containerの
vector
バージョン
は
bool
に対して特殊化されていません。
| 機能テスト マクロ | 値 | 標準 | 機能 |
|---|---|---|---|
__cpp_lib_containers_ranges
|
202202L
|
(C++23) | コンテナのための範囲構築と挿入 |
例
#include <cassert> #include <initializer_list> #include <iostream> #include <vector> void println(auto rem, const std::vector<bool>& vb) { std::cout << rem << " = ["; for (std::size_t t{}; t != vb.size(); ++t) std::cout << (t ? ", " : "") << vb[t]; std::cout << "]\n"; } int main() { std::vector<bool> v1; // 空のbool値ベクターを作成 println("1) v1", v1); std::vector<bool> v2{0, 1, 1, 0, 1}; // 初期化済みベクターを作成 println("2) v2", v2); v1 = v2; // v2をv1にコピー println("3) v1", v1); assert(v1.size() == v2.size()); // v1とv2のサイズが等しいことを確認 assert(v1.front() == false); // 先頭要素にアクセス、以下と同等: assert(v1[0] == false); assert(v1.back() == true); // 末尾要素にアクセス、以下と同等: assert(v1[v1.size() - 1] == true); v1 = {true, true, false, false}; // 初期化リストを代入 println("4) v1", v1); v1.push_back(true); // 末尾に要素を追加 println("5) v1", v1); v1.pop_back(); // 末尾から要素を削除 println("6) v1", v1); v1.flip(); // 全要素を反転 println("7) v1", v1); v1.resize(8, true); // v1をリサイズ、新しい要素は「true」に設定 println("8) v1", v1); v1.clear(); // v1を消去 assert(v1.empty()); // v1が空であることを確認 }
出力:
1) v1 = [] 2) v2 = [0, 1, 1, 0, 1] 3) v1 = [0, 1, 1, 0, 1] 4) v1 = [1, 1, 0, 0] 5) v1 = [1, 1, 0, 0, 1] 6) v1 = [1, 1, 0, 0] 7) v1 = [0, 0, 1, 1] 8) v1 = [0, 0, 1, 1, 1, 1, 1, 1]
不具合報告
以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| LWG 2187 | C++11 |
bool
の特殊化で
emplace
および
emplace_back
メンバ関数が欠如していた
|
追加された |