这是我如何定义我的图表,它是针对我正在处理的问题。
class Vertex;
Class Edge
{
Vertex *org;
Vertex *dest;
int traverse_time;
};
struct Vertex{
int id;
vector<Edge> edges;
int weight;
};
struct Graph{
vector<Vertex> vertices;
};
这就是我一直在添加顶点的方法
Graph* g1=new Graph;
Vertex* newvertex = addVertex(0);
graph1->vertices.push_back(*newvertex);
添加顶点功能可以正常工作但仍然需要
Vertex* addVertex(int id){
Vertex*newVertex = new Vertex;
newVertex->id=id;
newVertex->weight=0;
return newVertex;}
当我尝试向这些顶点添加边时,我遇到了问题。这就是我一直在做的事
org=&(g1->vertices[0]);
dest=&(g1->vertices[1]);
Edge* newedge=addRoad(org,dest,1);
org->edges.push_back(*newedge);
dest->edges.push_back(*newedge);
addEdge函数定义如下:
Edge* addedge(Vertex* j_id1,Vertex* j_id2,int t)
{
Edge *newedge =new Edge;
newedge->org=j_id1;
newedge->dest=j_id2;
newedge->traverse_time=t;
return newedge;
}
该功能在org->edges.push_back(*newedge);
答案 0 :(得分:2)
使用指向向量元素的指针时必须小心,因为当向量调整大小时(在没有剩余空间时调用push_back
),不能保证每个元素仍然会占用相同的元素记忆地址。
相反,请使用 indices 。
struct Edge
{
unsigned A, B; // indices
int weight;
Edge(unsigned a, unsigned b, int w) : A(a), B(b), weight(w) {}
};
struct Vertex
{
int id, weight;
vector<unsigned> edges; // edge indices
Vertex(int i, int w) : id(i), weight(w) {}
};
struct Graph
{
vector<Vertex> vertices;
vector<Edge> edges; // use a vector for edges too for EZ deallocation
// make the relevant functions members
void addVertex(int id)
{
// in-place constructor
vertices.emplace_back(id, 0);
}
bool addEdge(unsigned v1, unsigned v2, int t)
{
// check if indices are valid
if (v1 >= vertices.size() && v2 >= vertices.size())
return false;
unsigned newindex = edges.size(); // index of new edge
edges.emplace_back(v1, v2, t);
// add this edge's index to endpoints
vertices[v1].edges.push_back(newindex);
vertices[v2].edges.push_back(newindex);
return true;
}
};
许多其他可能的改进,但这至少应该解决内存访问问题。
答案 1 :(得分:0)
将Edge
从类更改为结构,或将其属性设为公共,类具有私有成员作为标准,而结构具有公共。
答案 2 :(得分:-1)
您的设计存在几个缺陷,为什么要将Edge定义为:
Class Edge
{
Vertex *org;
Vertex *dest;
int traverse_time;
};
如果将其邻居定义为邻接列表,则顶点之间的关系应该清楚,即:
Class Cost
{
int traverse_time;
};
struct Vertex{
int id;
map<shared_ptr<Vertex>, Cost> neighbours;
int weight;
};
接下来,当您在解决方案中添加顶点时,请编写:
Edge* newedge=addRoad(org,dest,1);
org->edges.push_back(*newedge);
dest->edges.push_back(*newedge);
由于你的边缘来自于原点,因此对于顶点顶点没有多大意义 - &gt; DEST。