【问题标题】:Array is somehow being modified by logic not using the array数组以某种方式被不使用数组的逻辑修改
【发布时间】:2014-11-18 22:54:04
【问题描述】:

我正在尝试用 C++ 构建 Kruskal 算法并编写了其中的一部分,代码如下:

#include <iostream>
#include <fstream>
#include <cstdio>
#include <cstdlib>
using namespace std;

class Edge {
    public:
        int to;
        int from;
        int weight;
        Edge();
        void print_edge();
};

Edge::Edge(void) {
}

void Edge::print_edge() {
    cout << "Edge to " << to << " from " << from << " of weight " << weight << endl;
}

int main() {
    int *vertex_sets;
    int vertex_size;
    int edge_size = 0;

    Edge* edges = new Edge[vertex_size * (vertex_size - 1) / 2];
    Edge* mst_edges = new Edge[vertex_size];

    cin >> vertex_size;
    vertex_sets = new int[vertex_size];

    for (int i = 0; i < vertex_size; i++) {
        int vertex_num;
        cin >> vertex_num;
        cout << "Assigning vertex set " << i << endl;
        vertex_sets[i] = i;
        int num_adjacent;
        cin >> num_adjacent;

        for (int j = 0; j < num_adjacent; j++) {
            edges[edge_size] = Edge();
            edges[edge_size].from = i;

            cin >> edges[edge_size].to >> edges[edge_size].weight;
            edge_size++;
        }
        cout << "Vertex " << i << " is in set " << vertex_sets[i] << endl;
        cout << "Vertex " << 0 << " is in set " << vertex_sets[0] << endl;
    }

    cout << endl;

    for (int i = 0; i < vertex_size; i++) {
        cout << "Vertex " << i << " is in set " << vertex_sets[i] << endl;
    }
}

但由于某种原因,vertex_sets 数组在 (int j = 0... 循环期间发生了变化,我不确定为什么会发生这种情况,因此打印语句。使用输入

8
0
2
4 2
5 6
1
1
6 1
2
2
3 2
4 2
3
4
2 2
4 3
6 5
7 4
4
3
0 2
2 2
3 3
5
2
0 6
6 2
6
3
1 1
3 5
5 2
7
1
3 4

我得到一个输出

Assigning vertex set 0
Vertex 0 is in set 0
Vertex 0 is in set 0
Assigning vertex set 1
Vertex 1 is in set 1
Vertex 0 is in set 0
Assigning vertex set 2
Vertex 2 is in set 2
Vertex 0 is in set 0
Assigning vertex set 3
Vertex 3 is in set 3
Vertex 0 is in set 3
Assigning vertex set 4
Vertex 4 is in set 4
Vertex 0 is in set 3
Assigning vertex set 5
Vertex 5 is in set 5
Vertex 0 is in set 3
Assigning vertex set 6
Vertex 6 is in set 6
Vertex 0 is in set 3
Assigning vertex set 7
Vertex 7 is in set 7
Vertex 0 is in set 3

Vertex 0 is in set 3
Vertex 1 is in set 2
Vertex 2 is in set 4
Vertex 3 is in set 3
Vertex 4 is in set 4
Vertex 5 is in set 5
Vertex 6 is in set 6
Vertex 7 is in set 7

这意味着由于某种原因,在循环的第四次迭代期间,索引 0 处的 vertex_sets 的值从 0 变为 3,我不知道为什么。谁能明白为什么会这样?

【问题讨论】:

  • 在初始化之前使用vertex_size 作为分配大小 3 行可能不是一个好主意。
  • 好收获。这可能是问题的一部分。
  • 此代码不能在 g++ 下按原样运行。我收到terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc Aborted
  • 嗯,出于某种原因,它让我编译它。嗯,原来是这个原因。不敢相信我花了这么长时间,专注于后半部分......
  • 在g++下编译,就是没有运行。

标签: c++ arrays pointers kruskals-algorithm


【解决方案1】:

如果你用一个未初始化的变量分配一个新数组,你会很糟糕。

Edge* edges = new Edge[vertex_size * (vertex_size - 1) / 2];
Edge* mst_edges = new Edge[vertex_size];

cin >> vertex_size;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-10
    • 2017-02-13
    • 1970-01-01
    • 1970-01-01
    • 2014-03-23
    • 1970-01-01
    • 1970-01-01
    • 2014-01-06
    相关资源
    最近更新 更多