从嵌套for循环中的指针集中删除项目

时间:2015-09-01 08:46:00

标签: c++ pointers iterator set nested-loops

我面前有以下问题: 我有一个包含顶点指针的集合。如果两个顶点相似,我想从集合中删除其中一个顶点。

我通过嵌套for循环检查:

set<Vertex*> vertexSet;
set<Vertex*> vertexSet2;

for(...) { // outer loop

    ...  //vertexSet gets filled externally    
    vertexSet2 = vertexSet; //copying vertexSet, to not delete from it, while iterating over it.

    for(it = vertexSet.begin(); it != vertexSet.end(); ++it) {
        for(jt = next(it); jt != vertexSet.end(); ++jt) {
            if((*it)->value == (*jt)->value) { //check if similar/equal
                vertexSet2.erase(jt); //erase the similar vertex out of the second set
            }
        }
    }

vertexSet2.clear();
vertexSet.clear(); //clear both sets for next outer loop iteration

} //end of outer loop

这适用于外环的第一次迭代。 问题是,当程序第二次到达将vertexSet的内容复制到vertexSet2的步骤时,它会崩溃。

我不明白,因为我正在清除两个集合,之后他们都有size()== 0。

任何想法可能是什么问题?

编辑:我现在相应地更改了我的代码。我只使用了1套,并改变了我增加jt迭代器的点。

set<Vertex*> vertexSet;

for(...) { // outer loop

    ...  //vertexSet gets filled externally 

    for(it = vertexSet.begin(); it != vertexSet.end(); ++it) {
        for(jt = next(it); jt != vertexSet.end();) { //REMOVED INCREMENT OF JT HERE

            set<Vertex*>::iterator temp = jt++; //AND MOVED IT HERE
            if((*it)->value == (*temp)->value) { //check if similar/equal
                vertexSet.erase(temp); //erase the similar vertex out of the second set
            }
        }
    }

vertexSet.clear(); //clear set

} //end of outer loop

1 个答案:

答案 0 :(得分:1)

问题在于内循环

vertexSet2.erase(jt);

这使jt无效。您需要将jt保存到某个temp迭代器,然后在擦除命令之前增加jt

temp = jt++;
vertexSet2.erase(temp);