使用c ++中的adjacency-list在图形中添加顶点

时间:2014-03-07 18:32:22

标签: c++ graph adjacency-list

这就是我定义图表的方式。这不是一个典型的图表,它特定于我正在处理的问题类型。

class Vertex;

class Edge
{
public:
    Vertex *org;
    Vertex *dest;
    bool dir;
};

struct Vertex{
    int id;
    vector<Edge> edges;
    int weight;
};
struct Graph{
    vector<Vertex> vertices;
};

我在图中添加顶点时遇到问题。这就是我在做的事情

Graph* graph1;
Vertex* first = addVertex(0);
graph1->vertices.push_back(*first);

addVertex函数工作正常,但是如果你还想引用,那么它就是

Vertex* addVertex(int id){
    Vertex*newVertex = new Vertex;
    newVertex->id=id;
    newVertex->weight=0;
    return newVertex;
}

该函数在graph1-&gt; vertices.push_back(* first)之前停止工作;

2 个答案:

答案 0 :(得分:2)

graph1本身是一个统一指针。因此,调用它的成员会导致程序崩溃。使用new运算符初始化它。

graph1 = new Graph();
// .......
delete graph1;

或者使用像std::unique_ptr这样的智能指针来自动管理内存。

答案 1 :(得分:0)

除了未初始化的Graph* graph1之外,您的代码中还存在另一个内存管理问题:

addVertex在其自己的堆内存块中分配单个Vertex。但是接下来

graph1->vertices.push_back(*first);

first复制到graph1的{​​{1}}管理的内存块中。

我想你是来自Java或Python等其他语言的C ++新手。你应该阅读一本介绍性的C ++书。与其他语言相比,C ++中的内存管理存在许多陷阱和概念需要跟踪。