vector<bool>

vector<bool> 类是 bool 类型元素的 vector 的部分专用化。 它包含由专用化使用的基础类型的分配器,此分配器通过每个位存储一个 bool 值的方式来提供空间优化。

语法

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

备注

除了本文中说明的差异以外,此类模板专用化的行为类似于 vector

处理 bool 类型的操作与容器存储中的值相对应。 allocator_traits::construct 不用于构造这些值。

Typedef

类型名称 说明
const_pointer const_iterator 的 typedef,可用作指向 vector<bool> 的布尔值元素的常量指针。
const_reference bool 的 typedef。 初始化之后,它不观察对原始值的更新。
pointer iterator 的 typedef,可用作指向 vector<bool> 的布尔值元素的指针。

成员函数

成员函数 说明
flip 反转 vector<bool> 中的所有位。
swap 交换两个 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>::referencevector<bool>::const_reference 对象。

如果指定的位置大于或等于容器大小,则结果为 undefined。

备注

在使用 _ITERATOR_DEBUG_LEVEL 集进行编译时,如果你尝试访问矢量边界以外的元素,则将发生运行时错误。 有关更多信息,请参阅经过检查的迭代器

示例

此代码示例演示如何正确使用 vector<bool>::operator[] 以及两种常见编码错误(已被注释掉)。这些错误将导致系统出错,因为无法使用 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 类是 vector<bool> 为模拟 bool& 而提供的一种代理类。

备注

必须使用模拟引用,因为 C++ 不允许直接引用位。 vector<bool> 每个元素只使用一个位,这可以使用此代理类来引用。 但是,引用模拟不会完成,原因是某些赋值无效。 例如,因为无法使用 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>::referencebool 的隐式转换。

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>) 的两个元素的静态成员函数。

static void swap(
    reference Left,
    reference Right);

参数

Left
将与 Right 元素交换的元素。

Right
将与 Left 元素交换的元素。

注解

此重载支持 vector<bool> 的特殊代理要求。 vector::swap 的功能与 vector<bool>::swap() 的单参数重载相同。

另请参阅

C++ 标准库中的线程安全
C++ 标准库参考