[英]C++ Creating Array of Pointers to Nodes in Directed Graph
我正在嘗試創建一個由指向節點的指針數組表示的有向圖,但是我正在努力將節點添加到圖的每個索引中。 這是我所擁有的:
struct Node {
int index;
list<Node*> outgoingNodes;
};
struct Graph {
Node* nodePointers; // Array of pointers to nodes in graph
int N; // Number of nodes in graph
};
這是我創建圖形的方式:
Graph* graph = new Graph();
graph->N = 7;
graph->nodePointers = new Node[graph->N];
然后,我嘗試通過以下方式將節點添加到圖中的索引0中,但出現錯誤:“操作數類型為'Node'和'Node *'”:
Node* a = new Node();
a->index = 0;
graph->nodePointers[0] = a;
在不更改任何結構的情況下,如何將節點正確添加到圖形的節點指針數組的索引中?
謝謝你的幫助!
Node* nodePointers
是指向Node
數組的指針。 如果要使用Node
指針數組,則需要將其聲明為Node** nodePointers
,並使用new Node*[graph->N]
分配該數組:
struct Graph {
Node** nodePointers; // Array of pointers to nodes in graph
int N; // Number of nodes in graph
};
int main() {
Graph* graph = new Graph();
graph->N = 7;
graph->nodePointers = new Node*[graph->N];
...
}
第一:
struct Node {
int index;
list<Node*> outgoingNodes;
};
盡管正確,但沒有明顯的原因它是無效的。 幾乎總是比列表更喜歡向量。 它很容易使用,但是占用的內存更少,並且在幾乎所有可能的用例上都可以更快地工作:
struct Node {
int index;
std::vector<Node*> outgoingNodes;
};
接下來,代碼:
struct Graph {
Node* nodePointers; // Array of pointers to nodes in graph
int N; // Number of nodes in graph
};
保存一個Node對象塊,而不是指向節點的指針。 最好的辦法是使用指針向量:
struct Graph {
std::vector<std::unique_ptr<Node>> nodePointers; // pointers to nodes in graph
};
這樣,重新分配和內存管理將是自動的。
然后,您的用法示例變為:
// are you sure graph has to be on the heap?
auto graph = std:: make_unique<Graph>();
graph->nodePointers.resize(7);
然后,您可以通過以下方式將節點添加到圖中的索引0中:
graph->nodePointers[0] = std::make_unique<Node>();
graph->nodePointers[0]->index = 0;
在不更改任何結構的情況下,如何將節點正確添加到圖形的節點指針數組的索引中?
然后您應該注意,“圖的數組”不是由指針組成的,而是由節點組成的。 因此添加節點的方式有所不同:
// you can still allocate the graph on the heap, but the following way is safer Graph graph; graph.N = 7; graph.nodePointers = new Node[graph.N];
但是現在nodePointers是一個錯誤的名詞,因為它應該被命名為節點(而不是指針)。
然后按照以下方式將節點添加到圖中的索引0中(到此為止,它已經被構造):
graph->nodePointers[0].outgoingNodes.push_back(&graph->nodePointets[2]);
並且添加一個邊緣看起來不錯:
graph->nodePointers[0].outgoingNodes.push_back(&graph->nodePointets[2]);
在線圖- graph->nodePointers[0] = a;
將其更改為graph->nodePointers[0] = *a;
它會工作。
現在讓我解釋一下,假設您想要一個int數組,則可以將其聲明為int x[10] or int *x=new int(10)
。 在第二種情況下,x顯示的是一個指向int對象而不是int指針的指針。 希望您能找到解決方案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.