vector<bool>STL中的陷阱

今天 ,写代码的时候我想用一个数组把布尔值存起来,就像这样: vector a; if (isOrder(num)) { a.push_back(true); }然后取他的一个元素的地址时:bool* ptr = &a[0];就出现了编译错误:error C2440: “初始化”: 无法从“std::_Vb_reference>> *”转换为“bool *”note: 与指
摘要由CSDN通过智能技术生成

今天 ,写代码的时候我想用一个数组把布尔值存起来,就像这样: 

vector<bool> a;
	if (isOrder(num)) {
		a.push_back(true);
	}
然后取他的一个元素的地址时:

bool* ptr = &a[0];
就出现了编译错误:

error C2440: “初始化”: 无法从“std::_Vb_reference<std::_Wrap_alloc<std::allocator<_Other>>> *”转换为“bool *”

note: 与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换

什么意思呢?

我查阅了文档,了解到在容器里C++标准对于vecotr<bool>值有其特殊的实现方法。目的是为了减小空间的耗用。一个bool值的存储其实只用了1位,也就是说要八个bool值才刚好是一个字节。而且由于vector<bool>逐位进行存取访问,所以访问速度通常比int之类的普通类型操作要慢很多。那么为什么其实如果不取地址的话话说可以编译成功的,那么为什么取地址以后就失败了呢?

我查阅到了这样一段话:


是的他是通过一种叫代理对象(proxy object)的方法来实现的,他不是一个标准容器,只是一个近似于容器的存在。

所以对于这种情况,我们应该尽量避免其发生,特别是算法中会否有对vecotr地址进行解引用操作的可能。

我们不建议这样使用vector,而应该使用unsigned char这样来代替。


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值