Я хотел бы создать орграф. Каждый 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>>
.
new Edge(nodei,nodej)
. Просто мои два цента.