std:: vector<bool>
|
定义于头文件
<vector>
|
||
|
template
<
class
Allocator
|
||
std
::
vector
<
bool
>
是针对
bool
类型的
std::vector
可能具有空间效率优化的特化版本。
std
::
vector
<
bool
>
实现空间效率的方式(以及是否进行优化)由具体实现定义。一种潜在的优化方案是将向量元素合并,使每个元素仅占用单个比特位,而非
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>
的公开成员函数)
|
|
非成员函数
|
(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
>
不一定满足所有
容器
或
序列容器
要求。例如,由于
std
::
vector
<
bool
>
::
iterator
是实现定义的,它可能不满足
前向迭代器
要求。使用需要
前向迭代器
的算法(例如
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; // 创建一个空的布尔值向量 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
成员函数
|
已添加 |