Namespaces
Variants

std:: vector<bool>

From cppreference.net
定义于头文件 <vector>
template <

class Allocator

> class vector < bool , 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

实现定义

(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> 的公开成员函数)

非成员函数

(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 > 不一定满足所有 容器 序列容器 要求。例如,由于 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 成员函数 已添加