你可能在写如下代码时,出现编译错误的问题:
int main(int argc,char** argv)
{
std::vector<bool> v_bool(2);
for(auto& item : v_bool)
item = false;
return 0;
}
错误信息如下:
error: invalid initialization of non-const reference of type ‘std::_Bit_reference&’ from an rvalue of type ‘std::_Bit_iterator::reference {aka std::_Bit_reference}’
for(auto& item : v_bool)
理解起来就是vector_bool不能用来做左值。为什么 vector_int都可以,而vector_bool不行呢?你可以百度更多的信息,或者查看C++ 的reference来得到答案。这里,我只是总结一点踩过的坑。
你一定知道一般来说int是4字节,bool是1字节,即
sizeof(int) == 4;
sizeof(bool) == 1;
但是如果是这样的呢:
std::vector<bool> v_bool(2);
std::vector<int> v_int(2);
sizeof(v_bool[0]) == ?;
sizeof(v_int[0]) == ?;
如果你写一个小程序测试就会发现
sizeof(v_bool[0]) == 16;
sizeof(v_int[0]) == 4;
是不是很奇怪,那如果你有一个函数fun,形参是bool&,那么,传入v_bool[0]将出现错误。
void fun(bool& use_huber)
{
use_huber = true;
}
fun(v_bool[0])//something is wrong
所以,为了给自己少挖坑,尽量少使用vector (其实使用vector也不能带来内存空间的节省效果),而用vector代替。