函数参数中的C ++ new

时间:2015-03-01 17:46:10

标签: c++ pointers syntax reference

我正在尝试构建一些网络流算法,我需要在图中表示边缘。

这是我的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 ++的新手,很抱歉,如果答案很明显:不,你必须在签名和身体中使用指针......)

3 个答案:

答案 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 ++中的首选方法,因为它避免了动态分配。