如何正确输入二维向量?
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_vec
和 x
变量被创建为向量各自部分的副本 - 这意味着在您的阅读循环之后, 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;
当我尝试如下设置和填充二维矢量时,我无法向它们输入 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_vec
和 x
变量被创建为向量各自部分的副本 - 这意味着在您的阅读循环之后, 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;