我正在尝试构建一些网络流算法,我需要在图中表示边缘。
这是我的Edge结构:
struct Edge{
int from, to, flow, cap;
Edge(int fromC, int toC, int flowC , int capC)
: from(fromC), to(toC), flow(flowC), cap(capC)
{};
};
然后我有邻接列表的图形结构:
struct Graph {
int N;
vector<vector<Edge> > adjList; // list of neighbours
Graph(int n) { // constructor
N=n;
adjList.resize(n);
}
};
然后我有把边添加到邻接列表的功能:
void addEdge ( Graph &G, Edge &E)
{
G.adjList[E.from-1].push_back(E);
}
我想使用这种语法:
Graph G = Graph(4); // creates graph with4 vertices
addEdge(G, new Edge(2, 4, 0, 4));
但这不起作用......我必须将功能更改为:
void addEdge(Graph &G, Edge *E)
然后修改函数体中的所有内容......
我的问题是: 有没有办法在函数调用中使用新函数,例如?:
addEdge(G, new Edge(2, 4, 0, 4));
感谢您的回答。 (我是C ++的新手,很抱歉,如果答案很明显:不,你必须在签名和身体中使用指针......)
答案 0 :(得分:2)
摆脱new
并让addEdge
接受const Edge&
。这可以让你简单地使用这样的自动临时:
addEdge(G, Edge(2,4,0,4));
addEdge
的签名变为void addEdge(Graph &G, const Edge &E)
。
答案 1 :(得分:0)
是的,你可以写:
addEdge(G, Edge(2,4,0,4));
但是你应该考虑性能问题。这个表单在堆栈上创建临时实例,所以你应该做一个副本(push_back alreade)。
答案 2 :(得分:-1)
声明addEdge
采用const
引用,因为您没有修改原始对象。
然后你可以这样做:
void addEdge ( Graph &G, const Edge &E) { ... }
addEdge(G, Edge(2,4,0,4));
这是C ++中的首选方法,因为它避免了动态分配。