std::vector<bool>
来自cppreference.com
<tbody>
</tbody>
| 在标头 <vector> 定义
|
||
template< class Allocator > class vector<bool, Allocator>; |
||
std::vector<bool> 是 std::vector 对类型 bool 为空间提效的特化。
std::vector<bool> 中对空间提效的行为(以及它是否有优化)是实现定义的。一种潜在优化涉及到 vector 的元素联合,使得每个元素占用一个单独的位,而非 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 ( 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> 的公开成员函数)
| |
| |
| 翻转所有位 (公开成员函数) | |
[静态] |
交换两个 std::vector<bool>::reference (公开静态成员函数) |
非成员函数
(C++20 移除)(C++20 移除)(C++20 移除)(C++20 移除)(C++20 移除)(C++20) |
按照字典顺序比较两个 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) 的算法,例如 std::search 可能导致编译时或运行时错误。
vector 的 Boost.Container 版本不对 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; // 创建空的布尔值向量
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++ 标准。
| 缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
|---|---|---|---|
| LWG 2187 | C++11 | 对 bool 的特化缺少 emplace 与 emplace_back 成员函数
|
已添加 |