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

Posted

技术标签:

【中文标题】从嵌套for循环中的指针集中删除项目【英文标题】:Delete items from set of pointers in nested for loop 【发布时间】:2015-09-01 08:45:59 【问题描述】:

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

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

【问题讨论】:

Deleting elements from STL set while iterating 进一步阅读:Iterator invalidation rules 我根据 Alex 的解决方案和 Piotr 的链接实现了该解决方案。我昨天已经看过它们了,但是很困惑如何处理外部迭代器 it.. @stainless 请注意,现在您正在跳过一项。您从jt = next (it) 开始,然后在比较之前再次增加jt。在比较中使用temp 而不是jt 哦,是的,这只是由于我的代码的简化,实际上我在引入临时迭代器之前获取了所有用于比较的数据 :) 但无论如何感谢您的回答,我会在代码。 【参考方案1】:

问题出在内部循环

vertexSet2.erase(jt);

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

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

【讨论】:

你也应该看到这些链接。 他没有错。这几乎就是第一个链接所说的。 @LogicStuff 为什么?请澄清。 我以为这是关于std::vector,抱歉我应该正确阅读。

以上是关于从嵌套for循环中的指针集中删除项目的主要内容,如果未能解决你的问题,请参考以下文章

如何加快大数据集中的两个嵌套 for 循环

用于删除数组项的嵌套 For 循环

无法从嵌套for循环访问父for循环

Python——用for循环删除列表中的元素

我如何使用指针摆脱复制矩阵值的四个循环?

我的 for 循环没有根据条件删除数组中的项目? Python [重复]