如何在 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 < vector > int > >
找到每一行的总和。
例如,如果这是输入,
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 >> 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 & outer:A) for(auto & inner:outer) cin >> inner;
@user4581301 我也会试试for (auto & outer:A) for(auto & inner:outer) cin >> 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>>的主要内容,如果未能解决你的问题,请参考以下文章