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/