我想创建一个有向图。每个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推送到结构中声明的指针向量?
答案 0 :(得分:1)
当你这样做时:
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>>
。