如何正确输入二维向量?

How to input 2D vector correctly?

当我尝试如下设置和填充二维矢量时,我无法向它们输入 int 数字。 我尝试使用基于范围的 for 循环输入数字;但它在预期的循环周期数后没有完成。

#include <iostream>
#include <vector>
using namespace std;

int main(){
    int N;
    vector<vector<int>> A(N,vector<int>(6)); 
    cin>>N;
    for(auto row_vec:A) {
        for(auto x:row_vec) cin>>x;
    }
    return 0;
}

该代码有什么问题?

以下是我在控制台的测试输入:

[ec2-user@ip-10-0-1-187 atcoder]$ ./052
2
1 2
2 4
2 4

例如,当 运行 你在 linux 上的代码时,我得到:

terminate called after throwing an instance of 'std::length_error'
  what():  cannot create std::vector larger than max_size()

如果你遇到过这个,它应该是问题的一部分;如果没有,您仍然应该更多地报告您所看到的实际行为;例如,您是否可以输入一些数字。 “它没有完成”是一个不清楚的问题描述。你的意思可能是它一直在询问号码,尽管你已经输入了你期望它要求的号码数量?

有了上面的提示,第一件事应该是检查向量初始化。你声明了整体大小N,但是你在哪里初始化它?使用后才设置!因此,它会尝试使用恰好位于将存储 N 的内存位置中的任何值来分配或多或少随机的、未知数量的内存。 在A初始化前需要移动N的读数:

    cin>>N;
    vector<vector<int>> A(N,vector<int>(6));

作为您显示的输入的旁注,请注意 cin 不区分 space 和换行符作为分隔符;因此,“第二级”向量的固定大小为 6,总大小为 2,您的循环将需要 12 个输入。

此外, row_vecx 变量被创建为向量各自部分的副本 - 这意味着在您的阅读循环之后, A 中的元素仍然都是 0,因为只设置了它的副本。 您必须通过将循环变量声明为 auto & 来明确表示您希望对 A 的部分进行 references。 读取 N 次 6 个变量的完整代码(并打印它们以查看它是否有效):

#include <iostream>
#include <vector>

int main()
{
    int N;
    std::cin>>N;
    std::vector<std::vector<int>> A(N,std::vector<int>(6));
    for(auto & row_vec:A)
    {
        for(auto & x:row_vec)
        {
            std::cin>>x;
        }
    }
    // print A to verify that values were set from input:
    for (auto const & row: A)    // note the use of const & to avoid copying
    {
        for (auto const & cell: row)
        {
            std::cout << cell << " ";
        }
        std::cout << "\n";
    }
    return 0;
}

最后一点:It's recommended to not use using namespace std;