详解std::find_if ()

最近的项目中标准库函数的使用比较频繁,最开始看别人的博客,总感觉很多博文都停留在套用层次,我是一个比较爱深究的人,闲暇之余查阅了很多文档。终于找到了满足我好奇心的解释。实际上像std::find_if()  std::for_each() 这样的函数就是简单的for循环,为了让我们少些代码而已^_^。又说了一大堆废话,好切入主题让我们一起揭开std::find_if() 神秘面纱。

它的定义大致这样的:

template<class InputIterator, class UnaryPredicate>
  InputIterator find_if (InputIterator first, InputIterator last, UnaryPredicate p)
{
      //迭代容器对结果进行判定操作
      for (;first != last; ++first) {
          if (true == p(*first)) {
              return first;
          }
      }
 return last;
}
最关键的是p它是一个可调用对象,用这个传入的委托可以处理判定逻辑,从而返回符合条件的第一个元素迭代器。

二、既然p是可调用对象,那我们可以这样定义p:

///[method 1]
bool fun1(int a)
{
    if (a < 30) {
        return true;
    } else {
        return false;
    }
}
 
 
///[method 2]
struct Fun2
{
public:
    bool operator()(int a)
    {
        if (a < 80) {
            return true;
        } else {
            return false;
        }
    }
};
 
 
///[method 3] 这种方式要求使用c++11,为了集中表达三种方式定义成了全局的,实际可做实参传入
auto fun3 = [] (int a) ->bool {
    if (a < 10) {
       return true;
    } else {
       return false;
    }
};
三、举个例子验证一把:

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QList<int> l = {78, 87, 27, 90, 45, 6};
    qDebug() << "*******使用全局函数**********";
    auto iterator_ = std::find_if(l.begin(), l.end(), fun1);
    qDebug() << (*iterator_);
    qDebug() << "*******使用重载()**********";//
    auto it2 = std::find_if(l.begin(), l.end(), Fun2());
    qDebug() << (*it2);
    qDebug() << "*******使用lambda表达式**********";//
    QList<int>::Iterator it3 = find_if(l.begin(), l.end(),fun3);
    qDebug() << (*it3);
    return a.exec();
}

猜你喜欢

转载自blog.csdn.net/ypy9323/article/details/79049746