【问题标题】:Create a pointer to an element in a vector<vector<bool>>创建指向向量中元素的指针<vector<bool>>
【发布时间】:2020-01-10 06:30:10
【问题描述】:

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

vector<vector<int>> a (5);
int* p1 = a[4].data();

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

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".

【问题讨论】:

标签: c++ pointers vector boolean


【解决方案1】:

std::vector&lt;bool&gt; 不幸的是,它是一种专门化,可以通过为每个元素只使用一点来节省空间。这不能保证,但可能会发生。

当这种情况发生时,意味着无法使用指向元素的指针(C++ 中对象的最小大小为一个字节),而且std::vector 的许多其他细节不适用于std::vector&lt;bool&gt;

只是不要使用它...如果您需要位打包自己实现它(至少您知道以可移植的方式得到什么)并且如果您不关心位与字节的节省,只需使用 @改为 987654325@(这是真正的 std::vector)。

std::vector&lt;bool&gt; 特化基本上是 C++ 的一个错误,它没有任何意义。不提供任何保证优势,并且可能会在未来产生问题(例如,即使对于目前不需要适当标准迭代器的代码,也可能是代码需要演变为需要它们,如果你使用了vector&lt;bool&gt;,那么你就完蛋了)。

【讨论】:

  • 如果您不需要因此不可用的功能,它有很多有意义的用途。这里有太多的恐惧。
  • struct bool_wrapper { bool value; };std::vector&lt;bool_wrapper&gt; 这需要一些打包和拆包。 (双关语。)
  • 我倾向于同意“令人恐惧的”评论。 vector&lt;bool&gt; 很好,只要在其定义的范围内使用。你不能责怪程序员试图将它硬塞到它不适合的使用模式中,然后在它不能按预期工作时抱怨它。在这种情况下,试图获取可能被打包在一个字节(最小的可寻址单元)内的东西的地址实际上是个问题。
  • @LightnessRacesinOrbit:问题是人们不希望std::vector&lt;bool&gt;boolstd::vector 不同。如果 C++ 想要提供一个“位”容器,那么它应该提供一个(以及关于如何处理它的保证/方法......例如,你知道如何有效地序列化 std::vector&lt;bool&gt; 吗?......你可以' t ...您必须遍历所有位)。 std::vector&lt;bool&gt; 是一个错误,不应该使用(甚至已经讨论过如何摆脱它,参见gotw.ca/publications/N1211.pdf)。
  • @6502 我知道这一切,但事实仍然是,如果您确实知道std::vector&lt;bool&gt; 是什么,那么您就可以很好地利用它。它有很多“有意义的用途”。
猜你喜欢
  • 2011-03-12
  • 1970-01-01
  • 2011-03-18
  • 1970-01-01
  • 2015-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多