zoukankan      html  css  js  c++  java
  • 【C++】STL算法之remove_if

    之前写过这样一段代码:

    auto iter=remove_if(AllEdges.begin(),AllEdges.end(),[&](Edge* edge){return _isEedge(edge); });
    for_each(AllEdges.begin(),AllEdges.end(),[&](Edge* edge){destroy(edge)});
    AllEdges.erase(iter,AllEdges.end());
    

    我当时的想法很简单,iter保存的是不满足lambda表达式的元素的尾,即所有满足元素的首。接着对这些我想要删除的元素进行destroy操作,最后从vector中删除。
    看上去好像没什么问题,可是程序老是出错,调试后发现问题就出现在我对粗体字部分的想当然。

    且看remove_if的源代码(摘自cpp官网):

    template <class ForwardIterator, class UnaryPredicate>
      ForwardIterator remove_if (ForwardIterator first, ForwardIterator last,
                                 UnaryPredicate pred)
    {
      ForwardIterator result = first;
      while (first!=last) {
        if (!pred(*first)) {
          *result = std::move(*first); //注意这句代码,并非使用swap
          ++result;
        }
        ++first;
      }
      return result;
    }
    

    从上述代码可以看出,remove_if返回的迭代器一直到end的区间内元素,与原容器此区间内容相同。因为此函数的思想就是遍历容器,将不符合lambda的元素从begin开始逐一覆盖。

    至于解决办法嘛,在remove_if遍历容器的过程将符合条件的元素destroy就行啦。

    AllEdges.erase(remove_if(AllEdges.begin(), AllEdges.end(), [&](Edge* edge){if (_isEedge(edge)) { destroy_edge(edge); return true; } return false; }), AllEdges.end());
    

    (:з」∠)

  • 相关阅读:
    MySql索引
    MySql事务、隔离级别
    41. 缺失的第一个正数
    442. 数组中重复的数据
    448. 找到所有数组中消失的数字
    转载:神奇的 SQL 之 联表细节 → MySQL JOIN 的执行过程(二)
    转载:神奇的 SQL 之 联表细节 → MySQL JOIN 的执行过程(一)
    697. 数组的度
    第三章 进程描述与控制
    C++ 对象成员函数(非静态方法)
  • 原文地址:https://www.cnblogs.com/cknightx/p/6718747.html
Copyright © 2011-2022 走看看