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



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

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

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

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

您就快到了;但是在使用它之后,您正在读取N。C++程序逐行执行,所以当涉及到new vector <int> [N]时,值N还没有读取!在C++术语中,您将使用未初始化的变量,这是不定义行为的一种形式。在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);

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

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

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

最新更新