未定义向量的元素的运算符 &=<bool>?

Operator &= for elements of vector<bool> not defined?

本文关键字:bool lt gt 元素 运算符 未定义 向量      更新时间:2023-10-16

我对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)

vector<bool>实际上不是一个容器。: P

文章说

(如果其他任何人写vector,它将被称为"nonconforming"answers"nonstandard"。)好吧,它是在标准中,所以在这一点上,叫它那些名字有点困难,但我们中的一些人还是尝试了,希望它最终会被清理干净。正确的解决方案是删除向量专门化要求,使vector实际上是一个普通的旧bool的向量。此外,它基本上是多余的:std::bitset就是为这种事情设计的。)…

std::vector不符合标准的原因是,它在试图优化空间时隐藏了一些技巧:不是为每个bool存储一个完整的char或int(在具有8位字符的平台上占用至少8倍的空间),而是将这些bool打包并将它们作为单独的位(例如在字符中)存储在其内部表示中。这样做的一个后果是,它不能只返回一个普通的bool&从它的操作符[]或解引用迭代器[2];相反,它必须使用一个类似bool但绝对不是bool的助手"代理"类来玩游戏。不幸的是,这也意味着对vector的访问速度较慢,因为我们必须处理代理而不是直接的指针和引用。

这样做的原因是vector<bool>在标准中被明确地调用为每项只取一位。

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

你可以使用deque<bool>,如果你想使用一个字节每项,并使运算符按预期工作。