我有一个类,它的成员是结构列表的向量,我想动态分配列表和列表中的元素。我不知道为什么,但由于某种原因,即使我添加了元素,我的列表似乎也是空的。
这是代码:
#include <iostream>
#include <vector>
#include <list>
using namespace std;
template <class Weight>
class Graph {
private:
struct Edge {
int node;
Weight weight;
};
vector<list<Edge>> nodes;
public:
Graph(int numberOfNodes) {
int i;
for (i=0; i < numberOfNodes; ++i) {
nodes.push_back(*(new list<Edge>));
}
}
void addEdge(int nodeA, int nodeB, Weight weight, bool bothWays= false) {
if (bothWays) {
addEdge(nodeB, nodeA, weight);
}
list<Edge> edgesA= nodes.at(nodeA);
Edge *edge= new Edge;
edge->node = nodeB;
edge->weight = weight;
edgesA.push_back(*edge);
}
void print() {
unsigned int i;
list<Edge> edges;
for(i=0; i < nodes.size(); ++i) {
cout << "Node " << i << ". Edges: ";
edges= nodes.at(i);
typename list<Edge>::iterator iterator = edges.begin();
typename list<Edge>::iterator end = edges.end();
for (; iterator != end; ++iterator) {
cout << "Node " << iterator->node << ". Weight: " << iterator->weight;
}
cout << endl;
}
}
};
Graph<int> generateRandomGraph(int numberOfNodes) {
Graph<int> g(numberOfNodes);
int i, j, weight=22;
for(i=0; i < numberOfNodes; ++i) {
for(j=i; j < numberOfNodes; j++) {
g.addEdge(i, j, weight, true);
}
}
return g;
}
int main() {
Graph<int> g= generateRandomGraph(3);
g.print();
}
它正在打印:
Node 0. Edges:
Node 1. Edges:
Node 2. Edges:
好像列表是空的。试图使用调试来找出问题所在,但没有运气。我来自 ANSI C 背景,但我仍然不确定 new 关键字是如何工作的。我应该在我的向量中存储一个指向列表的指针吗?我应该在列表中存储指向我的结构的指针吗?
此外,如果答案还可以提供如何在类的析构函数上释放内存,我将不胜感激。
注意:模板是为了让我的 Graph 上的权重可以定义为 int 或 float。
编辑:我只想补充一点,我之前没有使用任何硬编码指针。您在这里看到的代码是我经过几个小时的反复试验后得到的代码。