避免使用vector<bool>
2017-11-01 20:29
190 查看
vector作为容器,有以下两点不对:1)它不是stl容器 2)它并不存储bool
如果c是包含对象T的容器,而且c支持operate[],那么下面的代码必须能够被编译:
因此,vector是一个容器,那么下面的这段代码必须可以被编译:
结果,上述表达式并不能编译,原因是vector是一个假容器,它并不是真的存储bool,相反,为了节省空间,它存储的是bool的紧凑表示。
例如:对于vector容器,每个bool仅占一个二进制位,一个8位字节可容纳8个“bool”,如下代码:
上面程序的结果是32,正好验证了上述结论,bool类型是紧密在一起的,只能对整个位进行操作,思想与位域(bitfield)相似,来表示存储的bool,但只是假装是这样存的。
既然vector并不是一个完全容器,为什么还出现在c++d的标准中,只是为了一个试验,以演示STL如何通过代理来存储其元素的容器。
对于这个问题,c++标准提出了两种选择:1)用deque代替vector ;2)可以替代vector选择bitset,它不是STL库,但是标准c++库,它的大小在编译时就已经确定,所以不支持插入和删除操作。
参考:Scott Meyers-“Effective STL”
如果c是包含对象T的容器,而且c支持operate[],那么下面的代码必须能够被编译:
T *p= &c[0]
因此,vector是一个容器,那么下面的这段代码必须可以被编译:
vector<bool> v; bool *pb=&v[0]; //变量地址初始化一个bool*变量
结果,上述表达式并不能编译,原因是vector是一个假容器,它并不是真的存储bool,相反,为了节省空间,它存储的是bool的紧凑表示。
例如:对于vector容器,每个bool仅占一个二进制位,一个8位字节可容纳8个“bool”,如下代码:
vector<bool>v; v.reserve(10); for (int i = 1; i <=10; i++) v.push_back(i); cout<<sizeof(v[0]);
上面程序的结果是32,正好验证了上述结论,bool类型是紧密在一起的,只能对整个位进行操作,思想与位域(bitfield)相似,来表示存储的bool,但只是假装是这样存的。
既然vector并不是一个完全容器,为什么还出现在c++d的标准中,只是为了一个试验,以演示STL如何通过代理来存储其元素的容器。
对于这个问题,c++标准提出了两种选择:1)用deque代替vector ;2)可以替代vector选择bitset,它不是STL库,但是标准c++库,它的大小在编译时就已经确定,所以不支持插入和删除操作。
参考:Scott Meyers-“Effective STL”
相关文章推荐
- 避免使用vector<bool>
- 条款18:避免使用vector<bool>
- 避免使用vector<bool>
- 条款18:避免使用vector<bool>(转)
- 条款18:避免使用vector<bool>
- effective stl 条款18:避免使用vector<bool>
- 避免使用vector<bool>
- 避免使用vector<bool>
- 避免使用vector<bool>
- effective stl 第18条: 避免使用vector<bool>
- 为什么不建议使用vector<bool>
- 不要使用vector<bool>
- 不使用vector<bool>的原因和替代方法
- c++中bool数组与bitset,vector<bool>的使用与占用空间大小对比
- c++中为什么不提倡使用vector<bool>(转)
- 不使用vector<bool>的原因和替代方法
- VC 中使用 vector<struct Empoyee> Var定义 struct Employee
- <<编写可维护的JavaScript>>之避免使用全局变量
- 一些特殊容器:string,bitset,vector<bool>,空容器
- 《Effective C#》读书笔记——条目26:避免返回对内部类对象的引用<使用C#表达设计>