C++ 使用c+中的邻接列表在图中添加顶点+;

C++ 使用c+中的邻接列表在图中添加顶点+;,c++,graph,adjacency-list,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> vertic

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

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;
};
addVertex函数工作正常,但如果您仍要引用,请参见此处

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

函数在graph1->顶点之前停止工作。向后推(*第一)

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

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

或者使用智能指针(如
std::unique_ptr
)自动管理内存。

除了未初始化的
图形*graph1
,代码中还有另一个内存管理问题:

addVertex
在它自己的堆内存块中分配一个
顶点。但是

graph1->vertices.push_back(*first);
首先将
复制到
graph1
std::vector
管理的内存块中


<>我猜你是C++的新手,来自java或Python等其他语言。你应该阅读一本介绍性的C++书籍。与其他语言相比,C++中内存管理有很多陷阱和概念。

不!只需声明
图形1。仅在必要时使用指针。@japreis一般来说,是的。但在这里,它实际上取决于
graph1
的增长方式。
graph1->vertices.push_back(*first);