这是一个基本的指针问题,但这让我困惑了一段时间。我已经实现了一个加权图,使用 C++map
作为底层数据结构,如下所示:
std::map<int, std::vector<Edge> > edgeList;
此映射将节点 id (an) 保存为键,并使用 a作为值保存该节点int
上的边列表vector
我已经为每个节点初始化了边缘列表,如下所示:
for(int i = 0; i< n; i++){
std::vector<Edge> vi;
edgeList.insert(std::make_pair(i,vi)); // initialize with empty vector (at least, that's the intent)
}
现在,在向图中添加边时,当我尝试检索vector
与每个节点对应的边列表时,如下所示:
std::vector<Edge> vList = edgeList.at(v); // v is the node id here
返回一个空的vector
vList,尽管我之前已经向该 vList 添加了边。
另一方面,
std::vector<Edge> &vList = edgeList.at(v);
似乎为我的目的工作正常。谁能解释一下为什么第一个实现不起作用而第二个起作用?
编辑:将边添加到图形的代码如下:
void Graph::addEdge(Edge e){
// retrieve start and end node for this edge
int v = e.either(); // returns either end of the edge
int w = e.other(v);
// retrieve edge lists for these nodes
std::vector<Edge> vList = edgeList.at(v); // doesn't work
std::vector<Edge> wList = edgeList.at(w); // doesn't work
// add this edge to the list of edges
vList.push_back(e);
wList.push_back(e);
}