定义于头文件 <vector>
template<class Allocator> |
std::vector<bool> 是 std::vector 对类型 bool 为空间提效的特化。
std::vector<bool> 中对空间提效的行为(以及它是否有优化)是实现定义的。一种潜在优化涉及到 vector 的元素联合,使得每个元素占用一个单独的位,而非 sizeof(bool) 字节。
std::vector<bool> 表现类似 std::vector ,但为节省空间,它:
- 不必作为连续数组存储元素(故 &v[0] + n != &v[n] )
- 暴露类 std::vector<bool>::reference 为访问单个位的方法。尤其是,此类型的类为 operator[] 以值返回。
- 不使用 std::allocator_traits::construct 构造位值。
- 不保证同一容器中的不同元素能由不同线程同时修改。
表示到单个 bool 的引用的代理类
std::vector<bool>::reference
class reference; |
std::vector<bool> 特化定义 std::vector<bool>::reference 为可公开访问的嵌套类。 std::vector<bool>::reference 代理访问 std::vector<bool> 中单个位的行为。
std::vector<bool>::reference 的基础使用是提供能从 operator[]
返回的左值。
任何通过 std::vector<bool>::reference 发生的对 vector 的读或写,会潜在地读或写整个底层的 vector 。
成员函数
(构造函数) | 构造引用,仅为 std::vector<bool> 自身所能访问 (公开成员函数) |
(析构函数) | 销毁引用 (公开成员函数) |
operator= | 赋 bool 给被引用位 (公开成员函数) |
operator bool | 返回被引用位 (公开成员函数) |
flip | 翻转被引用位 (公开成员函数) |
std::vector<bool>::reference::~reference
~reference(); | ||
销毁引用。
std::vector<bool>::reference::operator=
reference& operator=( bool x ); | (C++11 前) | |
reference& operator=( bool x ) noexcept; | (C++11 起) | |
赋值给被引用位。
参数
x | - | 要赋值的值 |
返回值
*this
std::vector<bool>::reference::operator bool
operator bool() const; | (C++11 前) | |
operator bool() const noexcept; | (C++11 起) | |
返回被引用位。
参数
(无)
返回值
被引用位。
std::vector<bool>::reference::flip
void flip(); | (C++11 前) | |
void flip() noexcept; | (C++11 起) | |
反转被引用位。
参数
(无)
vector<bool> 特定修改器
翻转所有位
std::vector<bool,Allocator>::flip
void flip(); |
翻转 vector 中的每个 bool (以其反对值替换)。
参数
(无)
返回值
(无)
交换二个 std::vector<bool>::reference
std::vector<bool,Allocator>::swap
static void swap(reference x, reference y); |
交换 x
与 y
的内容。
参数
x | - | 要与 y 交换的 std::vector<bool>::reference 值 |
y | - | 要与 x 交换的 std::vector<bool>::reference 值 |
返回值
(无)
复杂度
常数。
帮助类
std::vector<bool> 的哈希支持
std::hash (std::vector<bool>)
template <class Allocator> struct hash<vector<bool, Allocator>>; | (C++11 起) |
std::hash 对 std::vector<bool> 的模板特化允许用户获得 std::vector<bool> 类型对象的哈希。
调用示例
#include <iostream>
#include <string>
#include <iterator>
#include <algorithm>
#include <functional>
#include <time.h>
#include <vector>
int main()
{
std::cout << std::boolalpha;
std::mt19937 g{std::random_device{}()};
srand((unsigned)time(NULL));
auto generate = []()
{
bool b = std::rand() % 2 == 0;
return b;
};
std::vector<bool> vecor_bool_1(6);
std::generate(vecor_bool_1.begin(), vecor_bool_1.end(), generate);
std::cout << "vecor_bool_1: ";
std::copy(vecor_bool_1.begin(), vecor_bool_1.end(),
std::ostream_iterator<bool>(std::cout, " "));
std::cout << std::endl;
std::cout << std::endl;
//翻转 vector 中的每个 bool (以其反对值替换)。
std::cout << "void flip(): " << std::endl;
vecor_bool_1.flip();
std::cout << "vecor_bool_1: ";
std::copy(vecor_bool_1.begin(), vecor_bool_1.end(),
std::ostream_iterator<bool>(std::cout, " "));
std::cout << std::endl;
std::cout << std::endl;
//交换 x 与 y 的内容。
std::cout << "static void swap(reference x, reference y): " << std::endl;
vecor_bool_1.swap(vecor_bool_1[0], vecor_bool_1[1]);
std::cout << "vecor_bool_1: ";
std::copy(vecor_bool_1.begin(), vecor_bool_1.end(),
std::ostream_iterator<bool>(std::cout, " "));
std::cout << std::endl;
std::cout << std::endl;
return 0;
}
输出