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

Delete items from set of pointers in nested for loop

本文关键字:指针 集中 删除 嵌套 for 循环      更新时间:2023-10-16

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

我通过嵌套的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

问题出在内循环

vertexSet2.erase(jt);

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

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