【问题标题】:returning bool& from vector [duplicate]从向量返回 bool& [重复]
【发布时间】:2012-07-02 02:30:45
【问题描述】:

在以下代码中:

class SomeClass {
    vector<int> i;
    vector<bool> b;

public:
    int& geti() {return i[0];}
    bool& getb() {return b[0];}
};

如果你注释掉getb(),代码编译得很好。显然,返回对存储在向量中的 int 的引用没有问题,但你不能用 bool 来做到这一点。

这是为什么?

【问题讨论】:

  • 考虑到现有的回复,您仍然可以通过使用std::vector&lt;bool&gt;::reference 作为函数的返回类型,而不是显式的bool&amp;,来“挽救”您的代码。 std::vector&lt;bool&gt;::reference 是代理类,它充当打包 std::vector&lt;bool&gt; 的通用引用。

标签: c++ stl vector


【解决方案1】:

std::vector&lt;bool&gt; 是“特殊的”。它将其元素存储为位数组,这意味着元素不可单独寻址,并且您无法获得对元素的引用。

std::vector&lt;bool&gt; 迭代器、它的operator[] 及其其他成员函数返回代理对象,这些对象提供对元素的访问,而无需存储实际的bool 对象。

如果您需要能够访问单个元素,请考虑使用std::vector&lt;char&gt; 或定义由char 支持的类似bool 的枚举(或signed charunsigned char,如果您关心的话签名)。

【讨论】:

  • +1 不错的收获……我什至没有想到。我花了一分钟。考虑引用当地人和其他东西......
  • 这令人难以置信。感谢您的回答。
  • IIRC std::vector&lt;bool&gt; 已弃用,不应使用。
  • @JesseGood: std::vector&lt;bool&gt; 未被弃用。
  • 好吧,google了一下,好像是提议的,但是C++标准委员会否决了。
【解决方案2】:

vectorbool> 是 bool 类型的特殊类模板特化。

提供这种专门用于优化空间分配:八个 bool 元素组合为一个字节,每个 bool 元素仅占用一位。

不允许在某个字节中引用一位。

所以函数无法返回对vectorbool>中的bool类型的引用。

也有人认为 vectorbool> 不是容器。

您可以改用双端队列bool>。

【讨论】:

    猜你喜欢
    • 2021-11-11
    • 2014-08-02
    • 2015-10-01
    • 1970-01-01
    • 2015-07-27
    • 2016-01-10
    • 2023-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多