2011-04-28 74 views
6

我用operator &=做了一些测试。如以下示例所示,这适用于单个bool类型以及vector<int>类型,但不适用于vector<bool>运算符&=对于元素矢量<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)

回答

8

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

文章说

(如果别人写了矢量,它会被称为“不符合”嗯,这是在标准的,这样就使得它一点点“非标准”。在这一点上更难称之为这些名字,但是我们中的一些人无论如何都希望它最终能够被清理掉,正确的解决方案是去除矢量特化要求,这样矢量真的是一个普通的老布尔矢量。 ,它主要是多余的:std :: bitset被设计用于这种事情。) ....

std :: vector的原因是nonconf或者它是在封面下拉动技巧以试图优化空间:对于每个布尔(至少占用8倍空间,在具有8位字符的平台上),而不是存储完整的char或int,它打包bools并将它们作为单独的位(内部,比如字符)存储在其内部表示中。这样做的一个后果就是它不能从它的运算符[]或其解除引用的迭代器[2]中返回正常的bool &;相反,它必须与助手“代理”类一起玩游戏,这类类似布尔型,但绝对不是布尔型。不幸的是,这也意味着访问一个向量是慢的,因为我们必须处理代理而不是直接指针和引用。

5

原因是vector<bool>在标准中明确指出每个项目只取一位。

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

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

+0

+1实际回答问题。 – 2011-04-28 17:38:58