3

我有这个代码:

#include <iostream>
#include <vector>

using namespace std;

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

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

4

3 回答 3

9

这是因为它std::vector<bool>是一种专业化,根本不像一个向量。这被广泛认为是标准中的一个主要缺陷。

为了节省内存,vector<bool>将每个元素存储为单个位。但是位不能单独寻址,因此operator[]不能返回bool&连接到位的引用。相反,它返回vector<bool>::reference... 并且cin不提供函数重载来处理这个问题。

(juanchopanza 正确地指出你的向量没有元素零。但即使它通过或其他机制做到了,不返回引用resize的事实仍然会妨碍。)operator[]

于 2013-03-25T14:32:55.333 回答
3

在您调用v[0]时,向量的大小为零,因此您正在访问越界。这是未定义的行为

此外,由于它不包含单个元素std::vector<bool>,因此它具有奇怪的行为。booloperator[]返回一种代理对象,对该运算符的调用可能不会达到您的预期。它应该小心使用,或者根本不使用。

您可以通过将值读入局部变量然后将其推入向量的后面来解决该问题,如本工作示例中所示(此处类似现场演示):

#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;
}
于 2013-03-25T14:34:09.367 回答
1

这应该有效:

#include <iomanip>

...

bool a;
cin >> boolalpha >> a;
v.push_back(a);

(除了 Ben Voigt 提到的问题之外,您当前的代码对于类型不安全,除了bool因为您的向量在您访问时为空v[0]。)

于 2013-03-25T14:34:01.423 回答