我面前有以下问题: 我有一个包含顶点指针的集合。如果两个顶点相似,我想从集合中删除其中一个顶点。
我通过嵌套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
答案 0 :(得分:1)
问题在于内循环
vertexSet2.erase(jt);
这使jt
无效。您需要将jt
保存到某个temp
迭代器,然后在擦除命令之前增加jt
。
temp = jt++;
vertexSet2.erase(temp);