vector<bool>STL中的陷阱

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

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这样来代替。

扫描二维码关注公众号,回复: 3834085 查看本文章


猜你喜欢

转载自blog.csdn.net/YoungStunner/article/details/50782885