C++中的二维向量输入

4zcjmb1e  于 2023-03-25  发布在  其他
关注(0)|答案(2)|浏览(149)

我是一个初学者在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;

}
ufj5ltwl

ufj5ltwl1#

std::vector<int>n(t);t整数构造向量。整数是默认构造的(实际上不确定,但无论如何...),它们用0初始化。
std::vector<std::vector<int>>x(t);t内部向量构造向量。内部向量是默认构造的,它们是空的。
尝试访问cin >> x[i][j];中不存在的元素会调用未定义的行为。x[i]是空向量。
你可以使用带另一个参数的构造函数,初始值。对于t大小的内部向量:

std::vector<std::vector<int>> x(t,std::vector<int>(t));

或者你可以调用resize

for (int i = 0; i < t; ++j) {
     x[i].resize(t);

或者reservepush_back

for (int i = 0; i < t; ++j) {
     x[i].reserve(t);
     for (int j=0; j < t; ++j) {
         x[i].push_back(42);
     }
}
5lwkijsr

5lwkijsr2#

用这个:

vector<vector<int>>x(t);

你用t个元素初始化一个向量,其中每个元素是一个std::vector<int>,它是用默认构造函数初始化的。默认构造函数给出一个空向量。所以,你在这里得到的是一个t x 0矩阵,t行和0列。
当你用下式访问向量x时

x[i][j]

你要求得到x的第i个元素,也就是std::vector<int>,然后从中得到第j个元素。但实际上有0个元素。关键是,访问[]does not carry any bounds checking的元素。所以程序将有未定义的行为。
在本部分中:

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

你用n[i]整数填充元素x[i]。知道这将是x[i]的大小,你可以修复程序添加

x[i] = std::vector<int>(n[i]);

for (int j = 0; j < n[i]; j++)循环之前。
或者,对于每个插入的数字,emplace_back一个新元素

for (int j = 0; j < n[i]; j++) {
        int el;
        cin >> el;
        x[i].emplace_back(el);
    }

(For这个解决方案你不应该插入x[i] = std::vector<int>(n[i]);之前的循环j).

相关问题