避免使用vector<bool>

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”

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值