cin到bools的矢量

时间:2013-03-25 14:31:33

标签: c++ vector stl boolean

我有这段代码:

#include <iostream>
#include <vector>

using namespace std;

int main(){
    vector <bool> v;
    cin >> v[0];
return 0;   
}

为什么我不能这样做?编译器不会编译它,但我在向量中有其他变量类型,它可以正常工作。这有什么问题?

3 个答案:

答案 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]时,您的向量为空。)