我不能动态声明一个向量数组

I cant declare dynamically an array of vectors

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

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

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

编辑:N 代表 节点 的数量,而不是边缘的数量。这不会影响分割错误,只会影响用向量表示图形的方式

如果您需要动态 N 您可以使用向量而不是数组:

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

还要确保您的 N 变量已初始化,否则您将在 arr 上遇到越界访问,这可能是段错误的原因。

你快到了;但是你正在阅读 N after 使用它。 C++ 程序是逐行执行的,所以当涉及到 new vector <int> [N] 时,值 N 还没有被读取!在 C++ 术语中,您将使用 未初始化的变量 ,它是 undefined behavior 的一种形式。在 C++ 中,与大多数其他语言不同,很容易编写无意义的程序并且编译器不会阻止您(尽管它可能会发出警告 - 请注意这些!)。

如果您将 cin >> N; 移动到 new vector <int> [N] 之前,那么它会更好地工作,但是等等,还有更好的解决方案...

与原始数组不同,使用向量的向量更为惯用。它更安全也更容易:

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

或者在 n 已知后简单地声明向量:

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