我是一个初学者在c++,所以我试图解决一个问题,在代码部队,我必须使一个二维向量,有行= 't'列= 'n[i]',我也试图使它。
但是当我运行程序时,它崩溃了,错误是“矢量下标超出范围”,我不知道如何修复它。
#include <iostream>
#include <vector>
using namespace std;
int main() {
int t;
cin >> t;
vector<int>n(t);
vector<vector<int>>x(t);
for (int i = 0; i < t; i++) {
cin >> n[i];
for (int j = 0; j < n[i]; j++) {
cin >> x[i][j];
}
}
return 0;
}
2条答案
按热度按时间ufj5ltwl1#
std::vector<int>n(t);
用t
整数构造向量。整数是默认构造的(实际上不确定,但无论如何...),它们用0
初始化。std::vector<std::vector<int>>x(t);
用t
内部向量构造向量。内部向量是默认构造的,它们是空的。尝试访问
cin >> x[i][j];
中不存在的元素会调用未定义的行为。x[i]
是空向量。你可以使用带另一个参数的构造函数,初始值。对于
t
大小的内部向量:或者你可以调用
resize
:或者
reserve
和push_back
:5lwkijsr2#
用这个:
你用t个元素初始化一个向量,其中每个元素是一个
std::vector<int>
,它是用默认构造函数初始化的。默认构造函数给出一个空向量。所以,你在这里得到的是一个t x 0
矩阵,t行和0列。当你用下式访问向量x时
你要求得到x的第i个元素,也就是
std::vector<int>
,然后从中得到第j个元素。但实际上有0个元素。关键是,访问[]
does not carry any bounds checking的元素。所以程序将有未定义的行为。在本部分中:
你用
n[i]
整数填充元素x[i]
。知道这将是x[i]
的大小,你可以修复程序添加在
for (int j = 0; j < n[i]; j++)
循环之前。或者,对于每个插入的数字,
emplace_back
一个新元素(For这个解决方案你不应该插入
x[i] = std::vector<int>(n[i]);
之前的循环j).