【问题标题】:I cant declare dynamically an array of vectors我不能动态声明向量数组
【发布时间】:2020-08-07 05:19:32
【问题描述】:

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

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

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

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

【问题讨论】:

  • 首先在用户输入值之前使用N。其次,你为什么要在这里使用new[]?如果您需要动态尺寸,只需使用vector&lt;vector&lt;int&gt;&gt;
  • 您确定在调用new 之前要初始化n 吗?发布给你一个错误的确切代码。
  • 既然您似乎对std::vector 很熟悉,为什么不使用它来代替new[]?您可以使用std::vector&lt;std::vector&lt;int&gt;&gt;

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


【解决方案1】:

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

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

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

【讨论】:

  • 即使在您编辑之后,它也不能解决 OP 的实际问题...... OP 有 UB,因为在给定值之前使用了 N。
  • 好吧,我假设N 具有某种价值...如果N 未初始化,那么是的,您将获得越界访问。
  • 这不是“越界访问”……你为什么要假设 N 有一个值,而在 OPs 代码中,它显然没有?
  • 在我的示例中,如果N&lt;42 那么是的,您正在对arr 进行越界访问。在他的问题中,他指出N 代表边数,所以我假设它以某种方式初始化。
  • 对不起,如果我没有说清楚,N 没有初始化,它作为文件的输入给出。
【解决方案2】:

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

如果您将cin &gt;&gt; N; 移动到new vector &lt;int&gt; [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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-09
    • 2022-08-12
    • 1970-01-01
    • 2019-07-25
    • 1970-01-01
    • 1970-01-01
    • 2013-02-25
    • 2014-04-30
    相关资源
    最近更新 更多