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