从嵌套 for 循环中的指针集中删除项目
Delete items from set of pointers in nested for loop
我面临以下问题:
我有一个包含指向顶点的指针的集合。如果两个顶点相似,我想从集合中删除其中一个。
我通过嵌套的 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
迭代器,然后在擦除命令之前增加 jt
。
temp = jt++;
vertexSet2.erase(temp);
我面临以下问题: 我有一个包含指向顶点的指针的集合。如果两个顶点相似,我想从集合中删除其中一个。
我通过嵌套的 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
迭代器,然后在擦除命令之前增加 jt
。
temp = jt++;
vertexSet2.erase(temp);