如果我想要一个指向int向量的向量中的元素的指针,我会写:
vector<vector<int>> a (5);
int* p1 = a[4].data();
但是,当我写以下内容时,它不适用于布尔向量的向量(为什么?)
vector<vector<bool>> b(5);
bool* p2 = b[4].data();
编译器输出以下错误消息:
Semantic issue: Error: Cannot initialize a variable of type "bool*" with an rvalue of type "void".
答案 0 :(得分:4)
std::vector<bool>
是一种专门化,可以通过仅对每个元素使用一点来节省空间。这不能保证,但是会发生。
这种情况意味着无法使用指向元素的指针(C ++中对象的最小大小为一个字节),并且std::vector
的许多其他细节也不适用于{{1} }。
请不要使用它...如果您需要位打包自己实现(至少您知道以便携式方式获得的东西),并且如果您不关心位与字节的节省,则只需使用{而是使用{1}}(这是真实的std::vector<bool>
)。
std::vector<unsigned char>
专业化基本上是C ++的一个错误,它没有有意义的用途。不提供任何保证的优势,并且将来可能会产生问题(例如,即使对于目前不需要适当的标准迭代器的代码,可能是代码需要演变为需要它们的情况,并且如果您使用了std::vector
,那么您注定要失败。