c到bool的向量

cin to vector of bools

本文关键字:向量 bool      更新时间:2023-10-16

我有这样的代码:

#include <iostream>
#include <vector>
using namespace std;
int main(){
    vector <bool> v;
    cin >> v[0];
return 0;   
}

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

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

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

(juanchopanza)正确地指出你的向量没有元素0。但是,即使通过resize或其他机制,operator[]不返回引用的事实仍然是一个障碍。

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

此外,std::vector<bool>是一个具有奇怪行为的专门化,因为它不包含单独的bool元素。它的operator[]返回一种代理对象,对该操作符的调用可能不会像您期望的那样。请谨慎使用,否则就不要使用。

您可以通过将值读入局部变量,然后将其压入vector的后面来解决这个问题,如下面的工作示例(类似于这里的实时演示):
#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;
}

应该可以:

#include <iomanip>
...
bool a;
cin >> boolalpha >> a;
v.push_back(a);

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