vector<bool>STL中的陷阱

C++的vector<bool>在STL中有一个特殊的实现,它利用位操作节省空间,但这也导致了一些问题。由于vector<bool>使用代理对象而非实际的bool数组,取地址操作可能会失败,导致编译错误。为避免此类问题,建议在需要布尔数组时使用unsigned char代替。
摘要由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这样来代替。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值