c++ - 我无法动态声明 vector 数组

标签 c++ memory vector segmentation-fault new-operator

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

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

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

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

最佳答案

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

如果将cin >> N;移到new vector <int> [N]之前,则效果会更好,但是,等等,还有更好的解决方案...

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

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

或者在知道n之后简单地声明 vector :
int n;
cin >> n;
std::vector<std::vector<int>> arr(n);

关于c++ - 我无法动态声明 vector 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61394738/

相关文章:

c++ - 哪个 C++ 编译器最符合最新的 C++ 标准

c++ - 引用模板的语法(别名?)

memory - GDB 'Addresses' 。这些是什么?

linux - 为什么Linux中的物理内存是线性增加而不是一次性分配的?

c++ - 如何隐藏基于模板参数的函数

c++ - 为什么复制构造函数与移动构造函数一起被调用?

PHP memory_get_usage

c++ - 一些 C++ vector 问题

c++ - 使用什么数据结构来快速存储文本文件,其中有变量号。行数和变量号子元素的快速,在 C++ 中?

r - 矩阵 "<="第 i 行中的元素是向量的第 i 个元素