关于std::vector<bool>

发布时间 2023-04-08 17:00:57作者: blogzzt

一、引子

std::vector<bool> 经常应用在leetcode刷题中。

但是effective stl 不建议使用std::vector<bool>,原因是:

  1. 严格意义上讲,vector<bool> 并不是一个 STL 容器;
  2. vector<bool> 底层存储的并不是 bool 类型值。

 

二、std::vector<bool>底层源码分析

std::vector<bool>,是类 sd::vector<T,std::allocator<T>> 的部分特化,为了节省内存,内部实际上是按bit来表征bool类型。从底层实现来看,std::vector<bool> 可视为动态std::bitset,只是接口符合 std::vector,换个名字表达为 DynamicBitset 更为合理。

 

三、解决方案

那么,如果在实际场景中需要使用 vector<bool> 这样的存储结构,该怎么办呢?很简单,可以选择使用 deque<bool> 或者 bitset 来替代 vector<bool>。

要知道,deque 容器几乎具有 vecotr 容器全部的功能(拥有的成员方法也仅差 reserve() 和 capacity()),而且更重要的是,deque 容器可以正常存储 bool 类型元素。

和 vector 容器不同的是,bitset 的大小在一开始就确定了,因此不支持插入和删除元素;另外 bitset 不是容器,所以不支持使用迭代器。