C++ new 函数参数
C++ new in function argument
我正在尝试构建一些网络流算法,我需要在图中表示边。
这是我的边缘结构:
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)
然后修改函数体中的所有内容...
我的问题是:
有没有办法在函数调用中使用 new 和像 ?:
这样的引用
addEdge(G, new Edge(2, 4, 0, 4));
感谢您的回答。 (我是 C++ 的新手,抱歉,如果答案很明显:不,你必须在签名和正文中使用指针...)
摆脱 new
并让 addEdge
接受 const Edge&
。这使您可以像这样简单地使用自动临时文件:
addEdge(G, Edge(2,4,0,4));
addEdge
的签名变成void addEdge(Graph &G, const Edge &E)
.
是的,你可以只写:
addEdge(G, Edge(2,4,0,4));
但是你应该考虑性能问题。这种形式在堆栈上创建临时实例,所以你应该做一个副本(push_back 已经做了)。
声明 addEdge
获取 const
引用,因为您没有修改原始对象。
那么你可以简单地这样做:
void addEdge ( Graph &G, const Edge &E) { ... }
addEdge(G, Edge(2,4,0,4));
这是 C++ 中的首选方法,因为它避免了动态分配。
我正在尝试构建一些网络流算法,我需要在图中表示边。
这是我的边缘结构:
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)
然后修改函数体中的所有内容...
我的问题是: 有没有办法在函数调用中使用 new 和像 ?:
这样的引用addEdge(G, new Edge(2, 4, 0, 4));
感谢您的回答。 (我是 C++ 的新手,抱歉,如果答案很明显:不,你必须在签名和正文中使用指针...)
摆脱 new
并让 addEdge
接受 const Edge&
。这使您可以像这样简单地使用自动临时文件:
addEdge(G, Edge(2,4,0,4));
addEdge
的签名变成void addEdge(Graph &G, const Edge &E)
.
是的,你可以只写:
addEdge(G, Edge(2,4,0,4));
但是你应该考虑性能问题。这种形式在堆栈上创建临时实例,所以你应该做一个副本(push_back 已经做了)。
声明 addEdge
获取 const
引用,因为您没有修改原始对象。
那么你可以简单地这样做:
void addEdge ( Graph &G, const Edge &E) { ... }
addEdge(G, Edge(2,4,0,4));
这是 C++ 中的首选方法,因为它避免了动态分配。