我想创建一个有向图。每个Edge都有有关destination Node
和origin Node
的信息。此外,每个节点都具有有关incomingEdges
和outgoingEdges
列表的信息。
我有一个图的adjacencyMatrix [] [],我想读取矩阵并创建一个新图。
这是代码;
struct Node
{
vector<Edge *> incomingEdges;
vector<Edge *> outgoingEdges;
};
struct Edge
{
struct Node destination;
struct Node origin;
};
。
。
。
。
for(int i=0; i<totalNodes; i++)
{
struct Node nodei;
}
。
。
。
。
。
for(int i=0; i<totalNodes; i++)
{
for (int j=0; j<totalNodes; j++)
{
if ( adjacencyMatrix[i][j] == 1)
{
struct Edge edgeij;
edgeij.destination=nodej;
edgeij.origin =nodei;
nodei->outgoing.push_back(edgeij); // ???
nodej->incoming.push_back(edgeij); // ???
}
}
}
我对C / C ++不熟悉。显然,我需要一些帮助来改进它。
如何将push_back返回到在结构体中声明的指针向量?
最佳答案
当您这样做时:
if ( adjacencyMatrix[i][j] == 1)
{
struct Edge edgeij;
edgeij.destination=nodej;
edgeij.origin =nodei;
nodei->outgoing.push_back(edgeij); // ???
nodej->incoming.push_back(edgeij); // ???
}
edgeij
对象在该块的末尾被破坏,使其变得毫无用处(并且代码无论如何都不会编译,因为您尝试将对象推入需要指针的位置)由于向量需要指针,因此应使用动态分配的
Edge
: Edge* edgeij = new Edge;
edgeij.destination=nodej;
edgeij.origin =nodei;
nodei->outgoing.push_back(edgeij);
nodej->incoming.push_back(edgeij);
// now, do not forget to properly delete resources allocated with new
更好的设计解决方案是完全避免使用原始指针,而更喜欢使用智能指针,例如
std::vector<std::unique_ptr<Node>>
。关于c++ - 用结构表示的有向图,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24953341/