Scott Meyers 的书第 18 条有效的 STL:改进标准模板库使用的 50 种具体方法说要避免vector <bool>
因为它不是一个 STL 容器并且它不能真正容纳bool
s.
下面的代码:
vector <bool> v;
bool *pb =&v[0];
无法编译,违反了 STL 容器的要求。
Error:
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>
作为一种特殊的标准容器,其中每个布尔值仅使用一位空间,而不是像普通布尔值那样使用一个字节(实现一种“动态位集”)。作为这种优化的交换,它不提供普通标准容器的所有功能和接口。
在这种情况下,由于您无法获取字节内位的地址,因此operator[]
无法返回bool&
而是返回一个代理对象,该对象允许操作有问题的特定位。由于这个代理对象不是bool&
,您不能将其地址分配给bool*
就像您对“普通”容器调用此类运算符的结果一样。反过来这意味着bool *pb =&v[0];
不是有效的代码。
另一方面deque
没有任何此类专门化,因此每个 bool 都占用一个字节,您可以获取从返回值的地址operator[]
.
最后请注意,MS 标准库实现(可以说)不是最佳的,因为它为双端队列使用了较小的块大小,这意味着使用双端队列作为替代品并不总是正确的答案。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)