运算符&amp; = for vector <bool>的元素未定义?</bool>

时间:2011-04-28 17:27:17

标签: c++

我使用operator &=进行了一些测试。如下面的示例所示,这适用于单bool类型和vector<int>类型,但不适用于vector<bool>

#include <vector>
int main (){

    bool a, b;
    a &= b; // ok
    std::vector<bool> c(1);
    c[0] &= b; // error
    c[0] = c[0] & b; // ok
    std::vector<int> d(1);
    d[0] &= b; // ok

    return 0;
}

有人能说出这里发生了什么吗?

(我正在使用gcc 4.4.3)

2 个答案:

答案 0 :(得分:8)

vector<bool> is not a container actually 。 :P

文章说

  

(如果有其他人写过矢量,它会被称为“不合格”和“非标准”。嗯,这是标准的,所以这使得它在这一点上更难称之为这些名称,但有些无论如何我们试着最终会被清理干净。正确的解决方法是去除向量专业化要求,这样向量确实是普通老bool的向量。此外,它主要是多余的:std :: bitset是为这种事。)   ....

     

std :: vector不合格的原因是它在试图优化空间的基础上提取技巧:而不是为每个bool存储一个完整的char或int(至少占用空间的8倍,在具有8位字符的平台上),它包含bool并将其作为单个位(内部,比如,字符)存储在其内部表示中。这样做的一个结果是,它不能只返回正常的bool&amp;来自其运算符[]或其解引用的迭代器[2];相反,它必须与助手“代理”类玩游戏,类似bool,但绝对不是一个bool。不幸的是,这也意味着对向量的访问速度较慢,因为我们必须处理代理而不是直接指针和引用。

答案 1 :(得分:5)

原因是vector<bool&gt;在标准中明确地调出,每个项目只占一位。

这样做的结果是operator[] vector<bool>返回代理对象而不是像所有其他包含类型一样直接引用。然后,代理对象不支持operator&=(尽管我没有参考,但最有可能是每个标准)。

如果您想为每个项目使用一个字节并让操作符按预期工作,则可以使用deque<bool>