为什么我的集合中的元素不会被删除?

时间:2014-03-20 05:57:15

标签: c++ set

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

2 个答案:

答案 0 :(得分:1)

在while循环中,您会在distance中查找最小元素,然后删除在nodes中找到的密钥。擦除不会改变distance,因为它是一个完全不同的容器。因此,下一个循环传递将在distance中为您提供相同的元素,erase上的nodes调用将无效,因为您已经第一次删除了该数字。

换句话说:您还必须从distance中删除您找到的元素,否则您将始终找到相同的最小值,并且永远不会从nodes中删除剩余的元素。

答案 1 :(得分:-2)

使用node.delete(node)然后重试。