返回布尔&从矢量

时间:2012-07-02 02:30:46

标签: c++ stl vector

在以下代码中:

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

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

如果您注释掉getb(),则代码编译正常。显然,返回对存储在向量中的int的引用没有问题,但您无法使用bool进行此操作。

为什么会这样?

2 个答案:

答案 0 :(得分:11)

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

std::vector<bool>迭代器,其operator[]及其他成员函数返回代理对象,提供对元素的访问,而不需要存储实际的bool个对象

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

答案 1 :(得分:2)

矢量&lt;的 BOOL &GT;是 bool 类型的特殊类模板特化。

提供此专业化以优化空间分配:八个 bool 元素组合为一个字节,每个bool元素仅占一位。

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

因此该函数无法在向量&lt; bool &gt;中返回对 bool 类型的引用。

有人还认为矢量&lt; bool &gt;不是容器。

您可以使用deque&lt; bool &gt;代替。