如何在 C++ 中将输入正确读入 2D 向量 vector<vector<int>>

Posted

技术标签:

【中文标题】如何在 C++ 中将输入正确读入 2D 向量 vector<vector<int>>【英文标题】:how to read input properly into a 2D vector, vector<vector<int>> in c++ 【发布时间】:2020-04-17 17:28:53 【问题描述】:

我需要在具有 n 列和 n 行的矩阵上使用 vector &lt; vector &gt; int &gt; &gt; 找到每一行的总和。

例如,如果这是输入,

n = 4 
1 2 3 4
1 1 1 2
2 2 41 8
3 3 10 2

输出应该是

10
5
53
18

这是我目前的代码:

vector<vector<int>> A;
int n, x;

cin >> n;

for (int i = 0; i < n; ++i) 
     for(int j = 0; j < n; ++j)
         cin >> x, A[i].emplace_back(x);

for(int i = 0 ; i < n ; ++i)

     int sum = accumulate(A[i].begin(), A[i].end(), 0);
     cout << sum << "\n";

另外我不认为我对矩阵的阅读是好的。

如果您能提供帮助,将不胜感激!

谢谢!

【问题讨论】:

警告:cin &gt;&gt; x, A[i].emplace_back(x); 没有A[i]。没有为外部 vector 分配存储空间。 建议:不要用逗号之类的愚蠢的东西混淆你的代码。只需放在括号中,让每个人都清楚地了解代码及其意图。 【参考方案1】:

要读入 2D 向量,您需要为每一行读入 1D 向量,然后将该 1D 向量添加到 2D 向量中。你可以这样做:

for (int i = 0; i < n; ++i) 
 
  std::vector<int> row;
  for(int j = 0; j < n; ++j)
  
    cin >> x;
    row.push_back(x);
  
  A.push_back(row);

您甚至可以为整个二维向量分配空间,然后直接读取到正确的位置,如下所示:

auto A = std::vector<std::vector<int>>(n, std::vector<int>(n, 0));

for (int i = 0; i < n; ++i) 
  for(int j = 0; j < n; ++j)
    cin >> A[i][j];

您可以按照评论的建议进一步简化这一点

auto A = std::vector<std::vector<int>>(n, std::vector<int>(n, 0));

for (auto &row : A) 
  for(auto &element : row)
    cin >> element;

您总结行的代码似乎是合理的。

【讨论】:

另一种选择:for (auto &amp; outer:A) for(auto &amp; inner:outer) cin &gt;&gt; inner; @user4581301 我也会试试for (auto &amp; outer:A) for(auto &amp; inner:outer) cin &gt;&gt; inner; 这个。谢谢! @user4581301 好主意,谢谢。将其添加到答案中。 @MogovanJonathan 如果这对您有用,请考虑accepting 答案。【参考方案2】:
int n, x;

cin >> n;
vector<vector<int>> A(n);

for (int i = 0; i < n; ++i) 
    for(int j = 0; j < n; ++j)
        cin >> x, A[i].push_back(x);

for(int i = 0 ; i < n ; ++i)

    int sum = accumulate(A[i].begin(), A[i].end(), 0);
    cout << sum << "\n";

问题是当向量的向量中没有向量时,您试图访问 A[i]

vector<vector<int>> A ----> 
vector<vector<int>> A(4) -----> // constructor initializes with 4 empty vectors 

现在您可以访问 A[i],它返回第 i 个向量对象,您可以在其上执行 push_back 以插入元素

【讨论】:

以上是关于如何在 C++ 中将输入正确读入 2D 向量 vector<vector<int>>的主要内容,如果未能解决你的问题,请参考以下文章

如何调整 2D C++ 向量的大小?

在C ++中将用空格分隔的字符串读入向量[关闭]

在 Tensorflow C++ 中将浮点向量传递给张量

如何在 C++ 中将 uint8_t 的向量转换为 std::string?

用户将元素输入到二维向量c++中

在 2D 向量上执行单行算术以找到简化的行形式 C++