Scott Meyers的书第18项有效STL:50改进您对标准模板库的使用的具体方法说要避免,vector <bool>因为它不是STL容器而且它实际上并不存在bool。以下代码:vector <bool> v; bool *pb =&v[0];不会编译,违反STL容器的要求。错误:cannot convert 'std::vector<bool>::reference* {aka std::_Bit_reference*}' to 'bool*' in initializationvector<T>::operator []返回类型应该是T&,但为什么它是一个特殊情况vector<bool>?什么是vector<bool>真正组成的呢?该项目进一步说:deque<bool> v; // is a STL container and it really contains bools这可以用作替代品vector<bool>吗?有人可以解释一下吗?
3 回答
泛舟湖上清波郎朗
TA贡献1818条经验 获得超3个赞
出于空间优化的原因,C ++标准(早在C ++ 98中)显式地调用了vector<bool>
一个特殊的标准容器,其中每个bool仅使用一位空间而不是一个字节作为普通bool(实现一种“动态bitset”)。作为这种优化的交换,它不提供普通标准容器的所有功能和接口。
在这种情况下,由于你不能在一个字节内取一个位的地址,所以诸如operator[]
不能返回一个bool&
但却返回一个允许操纵有问题的特定位的代理对象。由于此代理对象不是a bool&
,因此您无法将其地址分配给bool*
“正常”容器上的此类操作员调用的结果。反过来,这意味着这bool *pb =&v[0];
不是有效的代码。
另一方面deque
,没有任何这样的专业化调用,所以每个bool取一个字节,你可以从值返回的地址operator[]
。
最后请注意,MS标准库的实现(可以说)是次优的,因为它使用一个小的块大小来表示deques,这意味着使用deque作为替代并不总是正确的答案。
饮歌长啸
TA贡献1951条经验 获得超3个赞
vector<bool>
包含压缩形式的布尔值,仅使用一位作为值(而不是8如何bool []数组)。不可能在c ++中返回对某个位的引用,因此有一个特殊的帮助器类型“位引用”,它为您提供了内存中某些位的接口,并允许您使用标准运算符和强制转换。
- 3 回答
- 0 关注
- 966 浏览
添加回答
举报
0/150
提交
取消