c++ - 为什么 vector<bool> 不是 STL 容器?

标签 c++ vector stl containers bitvector

Scott Meyers 的书 Effective STL: 50 Specific Ways to Improvement Your Use of the Standard Template Library 的第 18 条说要避免 vector <bool>因为它不是一个 STL 容器,它并没有真正持有 bool s。

以下代码:

vector <bool> v; 
bool *pb =&v[0];

不会编译,违反了 STL 容器的要求。

错误:
cannot convert 'std::vector<bool>::reference* {aka std::_Bit_reference*}' to 'bool*' in initialization
vector<T>::operator []返回类型应该是 T& ,但为什么它是 vector<bool> 的特例? ?
vector<bool> 是什么意思真的包括吗?

该项目进一步说:
deque<bool> v; // is a STL container and it really contains bools

这可以用作vector<bool> 的替代品吗? ?

谁能解释一下?

最佳答案

出于空间优化的原因,C++ 标准(早在 C++98)显式调用了 vector<bool>作为一个特殊的标准容器,其中每个 bool 只使用一位空间,而不是像普通 bool 那样使用一个字节(实现一种“动态位集”)。作为这种优化的交换,它不提供普通标准容器的所有功能和接口(interface)。

在这种情况下,由于您不能在一个字节中获取位的地址,因此诸如 operator[] 之类的东西。无法返回 bool&而是返回一个允许操作相关特定位的代理对象。由于此代理对象不是 bool& ,您不能将其地址分配给 bool*就像您在“正常”容器上调用此类运算符(operator)的结果一样。反过来,这意味着 bool *pb =&v[0];不是有效的代码。

另一方面deque没有调用任何此类特殊化,因此每个 bool 占用一个字节,您可以从 operator[] 获取值返回的地址.

最后请注意,MS 标准库实现(可以说)是次优的,因为它为 deques 使用了小块大小,这意味着使用 deque 作为替代品并不总是正确的答案。

关于c++ - 为什么 vector<bool> 不是 STL 容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64383870/

相关文章:

c++ - 仅使用 boost 库中的属性树

c++ - 标准是否防止在可变参数模板中缩小具有足够小的文字值的文字转换

c++ - 从二叉搜索树中的 end() 迭代器递减迭代器

c++ - 对 vector push_back 的使用

c++ - 通过对已排序的 vector 使用二进制搜索来定位未排序的 vector 中的元素

c++ - 是否可以将 std::accumulate 与 std::min 一起使用?

c++ - 我是否保证在 move vector 后指向 std::vector 元素的指针有效?

c++ - 为什么我不能成功读取文件数据到结构数组

c++ - 使用 push_back 在类中填充结构的值

c++ - 如何在 C++ 中迭代包含 map 的 map