我使用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)
答案 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>
。