在 C++ 中具有未知大小输入的向量的向量

Vector of vector with unknown size input in c++

我需要输入向量的向量元素。向量的大小未知。

以*字符结尾的行输入,以及向量输入。

例子

2 5 1 3 4 *
9 8 9 *
3 3 2 3 *
4 5 2 1 1 3 2 *
*

代码:

#include <iostream>
#include <vector>
int main() {
  std::vector < std::vector < int >> a;
  int x;
  int i = 0, j = 0;
  for (;;) {
    while (std::cin >> x) {
      a[i][j] = x;
      j++;
    }
    if (!std::cin >> x) break;
    i++;
  }
  return 0;
}

这允许我只输入第一行,然后程序停止。你能帮我修改这个以允许输入其他行吗?

您的代码有两个问题:

  1. 您在没有先向每个 vector 添加任何值的情况下对每个 vector 进行索引,这是 未定义的行为 a[i][j] = x; 不会使矢量变大。请改用 vector::push_back()

  2. 您没有正确处理 * 的输入。 x 是一个 int,因此当 std::cin >> x 无法读取 non-integer 值时,如 *cin 将进入错误状态并且在您 clear() 错误和 ignore() 来自输入缓冲区的失败数据之前,所有进一步的阅读都会失败。

由于您的输入是 line-based,请考虑使用 std::getline() 一次读取每一行。您可以使用 std::istringstream 从每一行读取整数,例如:

#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <iomanip>

int main() {
  std::vector<std::vector<int>> a;
  std::string line;
  while (std::getline(std::cin, line)) {
    std::istringstream iss(line);
    iss >> std::ws;
    if (iss.peek() == '*') break;
    std::vector<int> v;
    int x;
    while (iss >> x) {
        v.push_back(x);
    }
    a.push_back(v);
  }
  for(auto &v : a) {
    for(int num : v) {
      std::cout << num << ' ';
    }
    std::cout << std::endl;
  }
  return 0;
}