Namespaces
Variants

std:: vector<bool>

From cppreference.net
ヘッダーで定義 <vector>
template <

class Allocator

> class vector < bool , 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

実装定義

(C++20まで)

実装定義 ConstexprIterator

(C++20以降)
const_iterator

実装定義

(C++20まで)

実装定義 ConstexprIterator

(C++20以降)
reverse_iterator std:: reverse_iterator < iterator >
const_reverse_iterator std:: reverse_iterator < const_iterator >

メンバー関数

翻訳内容: - "adds an element to the end" → "末尾に要素を追加" - "(public member function of std::vector )" → "(std::vector の公開メンバー関数)" HTMLタグ、属性、 タグ内のテキストはそのまま保持し、C++固有の用語(push_back, std::vector )は翻訳していません。
vector を構築する
( std::vector<T,Allocator> の公開メンバ関数)
vectorを破棄する vector
( 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> の公開メンバー関数)
最後の要素にアクセスする
( std::vector<T,Allocator> の公開メンバー関数)
イテレータ
先頭を指すイテレータを返す
( std::vector<T,Allocator> の公開メンバ関数)
(C++11)
終端へのイテレータを返す
( 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> の公開メンバー関数)
ストレージを予約
( 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> の公開メンバ関数)
要素を削除する
( std::vector<T,Allocator> の公開メンバー関数)
末尾に要素を追加
( std::vector<T,Allocator> の公開メンバー関数)
要素をその場で末尾に構築する
( std::vector<T,Allocator> の公開メンバ関数)
最後の要素を削除する
( std::vector<T,Allocator> の公開メンバ関数)
格納されている要素の数を変更する
( std::vector<T,Allocator> の公開メンバー関数)
内容を交換する
( std::vector<T,Allocator> の公開メンバー関数)
vector<bool> 固有の修飾子
すべてのビットを反転する
(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 アルゴリズムを特殊化する
(関数テンプレート)
特定の条件を満たすすべての要素を削除する
(関数テンプレート)

ヘルパークラス

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 メンバ関数が欠如していた 追加された