我有这段代码:
#include <iostream>
#include <vector>
using namespace std;
int main(){
vector <bool> v;
cin >> v[0];
return 0;
}
为什么我不能这样做?编译器不会编译它,但我在向量中有其他变量类型,它可以正常工作。这有什么问题?
答案 0 :(得分:9)
这是因为std::vector<bool>
是一种特殊化,并且根本不像一个向量。这被广泛认为是标准中的一个主要缺陷。
为了节省内存,vector<bool>
将每个元素存储为一个位。但是位不能单独寻址,因此operator[]
不能返回连接到位的bool&
引用。相反,它返回vector<bool>::reference
...而cin
不提供函数重载来处理此问题。
(juanchopanza正确地指出你的向量没有元素为零。但即使它通过resize
或其他机制,operator[]
不返回引用的事实仍然得到在路上。)
答案 1 :(得分:3)
当您调用v[0]
时,向量的大小为零,因此您正在访问越界。这是未定义的行为。
此外,std::vector<bool>
是一种特殊化,由于它不包含单个bool
元素,因此具有奇怪的行为。它的operator[]
返回一种代理对象,对该运算符的调用可能无法达到预期效果。它应该小心使用,或者根本不使用。
您可以通过将值读入局部变量然后将其推入向量的背面来解决问题,如本工作示例(similar live demo here)所示:
#include <vector>
#include <iostream>
int main()
{
std::vector<bool> v;
std::cout << std::boolalpha;
v.push_back(true);
std::cout << v[0] << std::endl;
bool b;
cin >> b;
v[0] = b;
std::cout << v[0] << std::endl;
}
答案 2 :(得分:1)
这应该有效:
#include <iomanip>
...
bool a;
cin >> boolalpha >> a;
v.push_back(a);
(除了Ben Voigt提到的问题之外,当前代码对bool
以外的类型不安全,因为当您访问v[0]
时,您的向量为空。)