如何在集合上进行迭代时删除集合中的相邻条目

johnco3

在遍历集合时如何擦除集合中的所有相邻条目。在我的情况下,我有一个自定义比较器,该比较器将相邻条目定义为从左到右相差1的那些条目。因此,对于该集合,std::set<int> mySet = {1,2,3,4,5,7,9,10}我想删除条目,{1,2,3,4,5,9,10}因为它们满足我的比较器的要求。(请注意,剩下的是7,因为它是系列中的唯一一个,不是相邻对中的元素之一。

下面的代码(也在coliru中)显示我可以找到正确添加相邻条目的方法,但是,如果我尝试同时擦除相邻对的左侧adjIter和右侧,则*std::next(adjIter)该代码会由于无效的迭代器而崩溃。

int main() {    
    std::set<int> mySet = {1,2,3,4,5,7,9,10};
    static const auto gPred = [](const auto& lhs, const auto& rhs) {
        return rhs == lhs+1;
    };
    auto adjIter = mySet.begin();
    std::set<int> adjacentEntries;
    while ((adjIter = std::adjacent_find(adjIter, mySet.end(),
        gPred)) != mySet.end()) {
        adjacentEntries.insert(*adjIter);
        // peek at the second entry that should be 1 greater than adjIter        
        adjacentEntries.insert(*std::next(adjIter));
        // how do I erase both *std::next(adjIter) & adjIter
        ++adjIter;
    }
    std::cout << adjacentEntries << std::endl;
}
番茄雷达

在谓词为true时继续保存和删除元素的更简单方法。

void remove_adjacent_entries()
{
    std::set<int> mySet = { 1,2,3,4,5,7,9,10 };
    static const auto gPred = [](const auto& lhs, const auto& rhs) {
        return rhs == lhs + 1;
    };

    auto adjIter = mySet.begin();
    std::set<int> adjacentEntries;
    while ((adjIter = std::adjacent_find(adjIter, mySet.end(), gPred)) != mySet.end()) {
        for (auto next = std::next(adjIter); next != mySet.end() && gPred(*adjIter, *next); ++next) {
            //save and delete the first of the pair of elements found
            adjacentEntries.insert(*adjIter);
            mySet.erase(adjIter++);
        }
        //save and delete the second element
        adjacentEntries.insert(*adjIter);
        mySet.erase(adjIter++);
    }
    //print
    for(auto& i : adjacentEntries)
        std::cout << i << std::endl;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在python中不断增长的集合上进行迭代

来自分类Dev

直接在集合上进行迭代,或使用迭代器

来自分类Dev

在基类集合上进行迭代时解决子类扩展方法

来自分类Dev

如何在std :: set上进行迭代时删除元素

来自分类Dev

如何在std :: set上进行迭代时删除元素

来自分类Dev

迭代IEnumerable时从集合中删除项目

来自分类Dev

如何在集合上使用模式匹配

来自分类Dev

如何在集合上使用max()?

来自分类Dev

如何在艰难的 mongo 集合上立足

来自分类Dev

在冻结的集合与集合上迭代的内存差异

来自分类Dev

对集合中的条目进行分类

来自分类Dev

如何在MongoDB中删除或删除集合?

来自分类Dev

在添加到VBA集合中时对其进行迭代

来自分类Dev

在Hashmap上进行迭代时删除元素

来自分类Dev

灰烬数据:如何在其他集合上获取集合中模型的汇总列表(@每个都不起作用)

来自分类Dev

for循环中相同集合上的迭代器

来自分类Dev

for循环中相同集合上的迭代器

来自分类Dev

如何更新集合上的TTL?

来自分类Dev

如何更新集合上的TTL?

来自分类Dev

如何在集合上将reduce()保留在Scala中?

来自分类Dev

如何在Entity Framework Code First中在子集合上创建表达式

来自分类Dev

MongoDB C#驱动程序-如何在.NET中的联接集合上强制投影?

来自分类Dev

如何在MeteorJS中更新MongoDB集合上的子文档数组

来自分类Dev

从mongo集合的数组中删除条目

来自分类Dev

在集合上使用updateOne时如何避免重复插入

来自分类Dev

如何在车把中的对象的属性上进行迭代

来自分类常见问题

为什么在迭代时添加到集合中或从集合中删除时会得到这么多迭代?

来自分类Dev

从集合中删除集合

来自分类Dev

如何在 Laravel 中迭代包含数组的集合数组?

Related 相关文章

  1. 1

    在python中不断增长的集合上进行迭代

  2. 2

    直接在集合上进行迭代,或使用迭代器

  3. 3

    在基类集合上进行迭代时解决子类扩展方法

  4. 4

    如何在std :: set上进行迭代时删除元素

  5. 5

    如何在std :: set上进行迭代时删除元素

  6. 6

    迭代IEnumerable时从集合中删除项目

  7. 7

    如何在集合上使用模式匹配

  8. 8

    如何在集合上使用max()?

  9. 9

    如何在艰难的 mongo 集合上立足

  10. 10

    在冻结的集合与集合上迭代的内存差异

  11. 11

    对集合中的条目进行分类

  12. 12

    如何在MongoDB中删除或删除集合?

  13. 13

    在添加到VBA集合中时对其进行迭代

  14. 14

    在Hashmap上进行迭代时删除元素

  15. 15

    灰烬数据:如何在其他集合上获取集合中模型的汇总列表(@每个都不起作用)

  16. 16

    for循环中相同集合上的迭代器

  17. 17

    for循环中相同集合上的迭代器

  18. 18

    如何更新集合上的TTL?

  19. 19

    如何更新集合上的TTL?

  20. 20

    如何在集合上将reduce()保留在Scala中?

  21. 21

    如何在Entity Framework Code First中在子集合上创建表达式

  22. 22

    MongoDB C#驱动程序-如何在.NET中的联接集合上强制投影?

  23. 23

    如何在MeteorJS中更新MongoDB集合上的子文档数组

  24. 24

    从mongo集合的数组中删除条目

  25. 25

    在集合上使用updateOne时如何避免重复插入

  26. 26

    如何在车把中的对象的属性上进行迭代

  27. 27

    为什么在迭代时添加到集合中或从集合中删除时会得到这么多迭代?

  28. 28

    从集合中删除集合

  29. 29

    如何在 Laravel 中迭代包含数组的集合数组?

热门标签

归档