创建指向向量<vector<bool>>中元素的指针

Ans*_* PP 3 c++ pointers boolean vector

如果我想要一个指向 int 向量向量中的元素的指针,我会写:

vector<vector<int>> a (5);
int* p1 = a[4].data();
Run Code Online (Sandbox Code Playgroud)

但是,当我编写以下内容时,它不适用于 bool 向量的向量(为什么?):

vector<vector<bool>> b(5);
bool* p2 = b[4].data();
Run Code Online (Sandbox Code Playgroud)

编译器输出以下错误消息:

Semantic issue: Error: Cannot initialize a variable of type "bool*" with an rvalue of type "void".
Run Code Online (Sandbox Code Playgroud)

650*_*502 5

std::vector<bool>不幸的是,这是一种专门化,可以通过为每个元素仅使用一点来节省空间。这不能保证,但有可能发生。

当这种情况发生时,意味着不可能使用指向元素的指针(C++ 中对象的最小大小是一个字节),而且许多其他细节std::vector也不适用于std::vector<bool>.

只是不要使用它......如果您需要位打包,请自己实现它(至少您知道以可移植的方式获得什么),如果您不关心位与字节的保存,只需使用一个std::vector<unsigned char>代替(即一个真实的std::vector)。

std::vector<bool>专业化基本上是 C++ 的一个错误,它没有任何意义的用途。不提供任何有保证的优势,并且可能在将来产生问题(例如,即使对于当前不需要适当的标准迭代器的代码,也可能是代码需要演变为需要它们,如果您使用了那么您vector<bool>'注定)。