未定义向量的元素的运算符 &=<bool>?
Operator &= for elements of vector<bool> not defined?
我对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>
,如果你想使用一个字节每项,并使运算符按预期工作。
- 写入向量<向量<bool>>
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- 让bool方法返回其他整数
- 如何在 std::vector 中找到<bool>哪些索引是真的?
- Arduino-C++ bool 不会从 false 变为 true
- 为什么在这种情况下,bool 类型的输出等于 0?
- 显式 std::exception_ptr 转换为 bool 不存在.VS2010 错误?
- 错误:不能使用"显式"说明符声明 bool'
- 为什么 C++ 11 在 ios 类中添加了运算符 bool
- 从标准::字符串到标准::矢量<bool>的快速转换
- 为什么 bool 和 _Bool 如果它们在内存中占用 1 个字节,它们只能存储 0 或 1
- 通过 mpi 发送 c++ 标准::矢量<bool>
- 为什么使用Pool和Bool而不是int8_t或char
- 如何为地图< map<int,int> 、bool > 分配值?
- 为什么更改包含 psapi.h 的顺序会产生编译错误?(标识符 BOOL 未定义)
- 使用 bool 和 const char 重载的 C++ 函数会在没有警告的情况下产生歧义 (MSVC2012)
- 返回 bool 作为 CPP 中 bool 运算符 [] 中的值