关于std::vector<bool>
一、引子
std::vector<bool>
经常应用在leetcode刷题中。
但是effective stl 不建议使用std::vector<bool>,原因是:
- 严格意义上讲,vector<bool> 并不是一个 STL 容器;
- 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 不是容器,所以不支持使用迭代器。