std::vector<bool>

来自cppreference.com
< cpp‎ | container
 
 
 
 
在标头 <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

由实现定义

(C++20 前)

由实现定义的常量表达式迭代器 (ConstexprIterator)

(C++20 起)
[编辑]
const_iterator

由实现定义

(C++20 前)

由实现定义的常量表达式迭代器 (ConstexprIterator)

(C++20 起)
[编辑]
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> 的公开成员函数) [编辑]
将范围的值赋给容器
(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++11)
返回指向末尾的迭代器
(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<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> 的公开成员函数) [编辑]
擦除元素
(std::vector<T,Allocator> 的公开成员函数) [编辑]
将元素添加到容器末尾
(std::vector<T,Allocator> 的公开成员函数) [编辑]
在容器末尾原位构造元素
(std::vector<T,Allocator> 的公开成员函数) [编辑]
移除末元素
(std::vector<T,Allocator> 的公开成员函数) [编辑]
改变存储元素的个数
(std::vector<T,Allocator> 的公开成员函数) [编辑]
交换内容
(std::vector<T,Allocator> 的公开成员函数) [编辑]
vector<bool> 特定修改器
翻转所有位
(公开成员函数) [编辑]
[静态]
交换两个 std::vector<bool>::reference
(公开静态成员函数) [编辑]

[编辑] 非成员函数

(C++20 移除)(C++20 移除)(C++20 移除)(C++20 移除)(C++20 移除)(C++20)
按照字典顺序比较两个 vector 的值
(函数模板) [编辑]
特化 std::swap 算法
(函数模板) [编辑]
擦除所有满足特定判别标准的元素
(函数模板) [编辑]

[编辑] 辅助类

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 的特化缺少 emplaceemplace_back 成员函数 已添加