您的位置:首页 > 其它

避免使用vector<bool>

2017-11-01 20:29 190 查看
vector作为容器,有以下两点不对:1)它不是stl容器 2)它并不存储bool

如果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”
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: