map<int,int> distance;
map<int,int> previous;
map<int,int>::iterator distIt;
map<int,int>::iterator prevIt;
set<int> nodes;
[..removed..]
it = topo.begin();
while(it != topo.end())
{
distance[it->first] = 9999;
previous[it->first] = 9999;
nodes.insert(it->first);
cout << "Processed: " << it->first << endl;
it++;
}
distance[source] = 0;
while(!nodes.empty())
{
distIt = min_element(distance.begin(), distance.end());
int node = distIt->first;
cout << "MIN: " << distIt->first << "|wtih cost|" << distIt->second << endl;
nodes.erase(node);
cin.get();
}
我得到的输出是:
Processed: 1
Processed: 1
Processed: 2
Processed: 2
Processed: 2
Processed: 3
Processed: 4
Processed: 4
Processed: 5
Processed: 5
MIN: 1|wtih cost|0
MIN: 1|wtih cost|0
MIN: 1|wtih cost|0
那么,为什么我erase(node)
在这里?
修改:此处的SSCCE:http://ideone.com/EQ7BHt
答案 0 :(得分:1)
在while循环中,您会在distance
中查找最小元素,然后删除在nodes
中找到的密钥。擦除不会改变distance
,因为它是一个完全不同的容器。因此,下一个循环传递将在distance
中为您提供相同的元素,erase
上的nodes
调用将无效,因为您已经第一次删除了该数字。
换句话说:您还必须从distance
中删除您找到的元素,否则您将始终找到相同的最小值,并且永远不会从nodes
中删除剩余的元素。
答案 1 :(得分:-2)
使用node.delete(node)
然后重试。