次の方法で共有


vector<bool> クラス

vector<bool> クラスは、bool. 型の要素の vector の部分的特殊化です。 このクラスには、特殊化によって使用される基になる型のアロケーターがあり、ビットごとに 1 つの bool 値を格納することによって領域を最適化します。

構文

template <class Allocator = allocator<bool>>
class vector<bool, Allocator>

解説

このクラス テンプレートの特殊化は vector と同様に動作しますが、この記事で説明する違いがあります。

bool 型を処理する操作は、コンテナーのストレージの値に対応します。 allocator_traits::construct はこれらの値の構築には使用されません。

Typedefs

型名 説明
const_pointer const_iterator のブール型要素への定数ポインターとして使用できる vector<bool> への typedef。
const_reference bool の typedef。 初期化後に、元の値への更新を確認しません。
pointer iterator のブール型要素へのポインターとして使用できる vector<bool> への typedef。

メンバー関数

メンバー関数 説明
flip vector<bool> 内のすべてのビットを反転させます。
swap 2 つの vector<bool> の要素を交換します。
operator[] 指定した位置における vector<bool> 要素へのシミュレートされた参照を返します。
at vector::at 関数と同様に機能します。ただし、プロキシ クラス vector<bool>::reference を使用します。 「operator[]」も参照してください。
front vector::front 関数と同様に機能します。ただし、プロキシ クラス vector<bool>::reference を使用します。 「operator[]」も参照してください。
back vector::back 関数と同様に機能します。ただし、プロキシ クラス vector<bool>::reference を使用します。 「operator[]」も参照してください。

プロキシ クラス

名前 説明
vector<bool>::reference クラス bool& の動作をシミュレートするためのプロキシとして機能するクラスで、そのオブジェクトは vector<bool> オブジェクト内の要素 (単一ビット) への参照を提供できます。

要件

ヘッダー: <vector>

名前空間: std

vector<bool>::const_pointer

vector<bool> オブジェクトに格納されるシーケンスのブール要素への定数ポインターとして使用できるオブジェクトを表す型。

typedef const_iterator const_pointer;

vector<bool>::const_reference

vector<bool> オブジェクトに格納されるシーケンスのブール要素への定数参照として使用できるオブジェクトを表す型。

typedef bool const_reference;

解説

詳細およびコード例については、「vector<bool>::reference::operator=」を参照してください。

vector<bool>::flip

vector<bool> 内のすべてのビットを反転させます。

void flip();

// vector_bool_flip.cpp
// compile with: /EHsc /W4
#include <vector>
#include <iostream>

int main()
{
    using namespace std;
    cout << boolalpha; // format output for subsequent code

    vector<bool> vb = { true, false, false, true, true };
    cout << "The vector is:" << endl << "    ";
    for (const auto& b : vb) {
        cout << b << " ";
    }
    cout << endl;

    vb.flip();

    cout << "The flipped vector is:" << endl << "    ";
    for (const auto& b : vb) {
        cout << b << " ";
    }
    cout << endl;
}

vector<bool>::operator[]

指定した位置における vector<bool> 要素へのシミュレートされた参照を返します。

vector<bool>::reference operator[](size_type Pos);

vector&<bool&>::const_reference operator[](size_type Pos) const;

パラメーター

Pos
vector<bool> 要素の位置。

戻り値

インデックス付けされた要素の値を格納する vector<bool>::reference または vector<bool>::const_reference オブジェクト。

指定された位置がコンテナーのサイズ以上の場合、結果は未定義になります。

解説

_ITERATOR_DEBUG_LEVEL を設定してコンパイルした場合、ベクターの境界の外にある要素にアクセスしようとすると、実行時エラーが発生します。 詳細については、「チェックを行う反復子」を参照してください。

このコード例では、vector<bool>::operator[]の正しい使用方法と、コメント アウトされている 2 つの一般的なコーディングミスを示します。vector<bool>::operator[]返されるvector<bool>::reference オブジェクトのアドレスを取得できないため、これらの間違いによりエラーが発生します。

// cl.exe /EHsc /nologo /W4 /MTd
#include <vector>
#include <iostream>

int main()
{
    using namespace std;
    cout << boolalpha;
    vector<bool> vb;

    vb.push_back(true);
    vb.push_back(false);

    //    bool* pb = &vb[1]; // conversion error - do not use
    //    bool& refb = vb[1];   // conversion error - do not use
    bool hold = vb[1];
    cout << "The second element of vb is " << vb[1] << endl;
    cout << "The held value from the second element of vb is " << hold << endl;

    // Note this doesn't modify hold.
    vb[1] = true;
    cout << "The second element of vb is " << vb[1] << endl;
    cout << "The held value from the second element of vb is " << hold << endl;
}
The second element of vb is false
The held value from the second element of vb is false
The second element of vb is true
The held value from the second element of vb is false

vector<bool>::pointer

vector<bool> オブジェクトに格納されるシーケンスのブール要素へのポインターとして使用できるオブジェクトを表す型。

typedef iterator pointer;

vector<bool>::reference クラス

vector<bool>::reference クラスは bool& をシミュレートするために vector<bool> クラスによって提供されるプロキシ クラスです。

解説

C++ では、ネイティブにビットを直接参照しないため、シミュレートされた参照が必要です。 vector<bool> は、要素ごとに 1 ビットだけ使用します。このビットは、このプロキシ クラスを使用して参照できます。 ただし、参照のシミュレーションは、特定の代入が有効でないため、完全ではありません。 たとえば、 vector<bool>::reference オブジェクトのアドレスを取得できないため、 vector<bool>::operator[] を使用する次のコードは正しくありません。

vector<bool> vb;
//...
bool* pb = &vb[1]; // conversion error - do not use
bool& refb = vb[1];   // conversion error - do not use

vector<bool>::reference::flip

参照先の vector<bool> 要素のブール値を反転します。

void flip();

// vector_bool_ref_flip.cpp
// compile with: /EHsc /W4
#include <vector>
#include <iostream>

int main()
{
    using namespace std;
    cout << boolalpha;

    vector<bool> vb = { true, false, false, true, true };

    cout << "The vector is: " << endl << "    ";
    for (const auto& b : vb) {
        cout << b << " ";
    }
    cout << endl;

    vector<bool>::reference vbref = vb.front();
    vbref.flip();

    cout << "The vector with first element flipped is: " << endl << "    ";
    for (const auto& b : vb) {
        cout << b << " ";
    }
    cout << endl;
}
The vector is:
    true false false true true
The vector with first element flipped is:
    false false false true true

vector<bool>::reference::operator bool

vector<bool>::reference から bool への暗黙の変換を提供します。

operator bool() const;

戻り値

vector<bool> オブジェクトの要素のブール値。

解説

vector<bool> オブジェクトは、この演算子では変更できません。

vector<bool>::reference::operator=

ブール値をビットに割り当てます。または参照先の要素が保持している値をビットに割り当てます。

reference& operator=(const reference& Right);
reference& operator=(bool Val);

パラメーター

Right
値がビットに割り当てられている要素の参照。

Val
ビットに割り当てられるブール値。

// vector_bool_ref_op_assign.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>
#include <string>

using namespace std;

template <typename C> void print(const string& s, const C& c) {
    cout << s;

    for (const auto& e : c) {
        cout << e << " ";
    }

    cout << endl;
}

int main()
{
    cout << boolalpha;

    vector<bool> vb = { true, false, false, true, true };

    print("The vector is: ", vb);

    // Invoke vector<bool>::reference::operator=()
    vector<bool>::reference refelem1 = vb[0];
    vector<bool>::reference refelem2 = vb[1];
    vector<bool>::reference refelem3 = vb[2];

    bool b1 = refelem1;
    bool b2 = refelem2;
    bool b3 = refelem3;
    cout << "The original value of the 1st element stored in a bool: " << b1 << endl;
    cout << "The original value of the 2nd element stored in a bool: " << b2 << endl;
    cout << "The original value of the 3rd element stored in a bool: " << b3 << endl;
    cout << endl;

    refelem2 = refelem1;

    print("The vector after assigning refelem1 to refelem2 is now: ", vb);

    refelem3 = true;

    print("The vector after assigning false to refelem1 is now: ", vb);

    // The initial values are still stored in the bool variables and remained unchanged
    cout << "The original value of the 1st element still stored in a bool: " << b1 << endl;
    cout << "The original value of the 2nd element still stored in a bool: " << b2 << endl;
    cout << "The original value of the 3rd element still stored in a bool: " << b3 << endl;
    cout << endl;
}
The vector is: true false false true true
The original value of the 1st element stored in a bool: true
The original value of the 2nd element stored in a bool: false
The original value of the 3rd element stored in a bool: false

The vector after assigning refelem1 to refelem2 is now: true true false true true
The vector after assigning false to refelem1 is now: true true true true true
The original value of the 1st element still stored in a bool: true
The original value of the 2nd element still stored in a bool: false
The original value of the 3rd element still stored in a bool: false

vector<bool>::swap

プロキシ クラス vector<bool>::reference を使用してブール ベクター (vector<bool>) の 2 つの要素を交換する静的メンバー関数。

static void swap(
    reference Left,
    reference Right);

パラメーター

Left
Right 要素と交換される要素。

Right
Left 要素と交換される要素。

解説

このオーバーロードは vector<bool> の特別なプロキシの要件をサポートします。 vector::swap には、vector<bool>::swap() の単一引数のオーバーロードと同じ機能があります。

関連項目

C++ 標準ライブラリ内のスレッド セーフ
C++ 標準ライブラリ リファレンス