我无法动态声明向量数组

问题描述 投票:1回答:2

我的目的是创建一个邻接表来表示图,我选择使用向量来完成。我的问题是图形的顶点和边的数量并不总是相同的,而是在输入中给出的。因此,我尝试动态声明向量数组。这是我的代码(其中N代表边数):

int N;
vector <int> *arr;
arr = new vector <int> [N];
cin >> N;`

[每次我尝试处理向量(ig arr[0].push_back(3);)时,都会遇到分割错误。我在做什么错了:(

c++ memory vector segmentation-fault new-operator
2个回答
0
投票

如果需要动态N,则可以使用向量代替数组:

std::vector<std::vector<int>> arr(N);
arr[42].push_back(42);

还请确保已初始化您的N变量,否则您将在arr上遇到超出范围的访问,这很可能是段错误的原因。


0
投票

您快要在那里了;但是您正在使用它读取N after。 C ++程序逐行执行,因此当涉及到new vector <int> [N]时,尚未读取值N!在C ++术语中,N是uninitialized variable,它是undefined behavior的形式。与大多数其他语言不同,在C ++中,编写无意义的程序非常容易,并且编译器不会阻止您(尽管它可能会发出警告-请注意那些!)。

如果将cin >> N;移至new vector <int> [N]之前会更好,但是,有更好的解决方法...

代替原始数组,具有向量vector更为习惯。它更安全也更容易:

std::vector<std::vector<int>> arr;
int n;
cin >> n;
arr.resize(n);

// now you can start filling it...
arr[0].push_back(3);
// . . .
© www.soinside.com 2019 - 2024. All rights reserved.