find_if()用法

来源:互联网 发布:科尔宾 知乎 编辑:程序博客网 时间:2024/04/28 06:22

find_if 算法的定义如下:

template<class InputIterator, class T, class Predicate> inline

 

   InputIterator find_if(

 

      InputIterator First,

 

      InputIterator Last,

 

      Predicate Predicate

 

   )

 

  它和find算法很类似返回的是找到元素的佚代器。它的第三个参数是一个函数指针(function pointer)或函数对像(object functional)如果是函数对像,它的定义可以是这样。

template <class T>

 

class fun

 

{

 

public:

 

bool operator()(const T &a)const

 

{

 

        if(a > 10)

 

               return true;

 

}

 

};

 

这里实现了一个找出大于30的元素(当然元素不一不是int型的)这里是一个小例子:

#include <iostream>

 

#include <algorithm>

 

#include <functional>

 

#include <vector>

 

#include "time.h"

 

using namespace std;

 

 

int _rand()

 

{

 

return rand()%100;

 

}

 

 

template <class T>

 

class fun

 

{

 

public:

 

bool operator()(const T &a)const

 

{

 

        return a>30;

 

       

 

}

 

 

};

 

int main(int argc, char* argv[])

 

{

 

srand(time(NULL));

 

vector<int> vec(16);

 

generate(vec.begin(),vec.end(),_rand);

 

copy(vec.begin(),vec.end(),ostream_iterator<int>(cout," "));

 

 

cout << endl; 

 

vector<int>::iterator itr =vec.begin();

 

while(itr != vec.end())

 

{

 

        itr = find_if(itr,vec.end(),fun<int>());

 

        if(itr != vec.end())

 

        {

 

               cout <<*itr << " ";

 

               itr++;

 

        }

 

}

 

return 0;

 

}

 

 

但是,如果我们要比较的数是一个在运行时改变的数,比如,第一次要找大去30的,第二次要找大于35的,这如何时实呢?对,binder2nd()!

它是一个模版类定义在<functional>头文件里。

template<class Operation>

 

   class binder2nd

 

      : public unary_function <

 

         typename Operation::first_argument_type,

 

         typename Operation::result_type>

 

   {

 

   public:

 

   typedef typename Operation::first_argument_type argument_type;

 

   typedef typename Operation::result_type result_type;

 

   binder2nd(

 

      const Operation& _Func,

 

      const typename Operation::second_argument_type& _Right

 

   );

 

   result_type operator()(

 

      const argument_type& _Left

 

   ) const;

 

   result_type operator()(

 

   argument_type& _Left

 

   ) const;

 

   protected:

 

   Operation op;

 

   typename Operation::second_argument_type value;

 

   };

 

怎么样,看晕了吧?简单说下_Func是要绑定的函数对象,_Right是要绑定的二原函数的第二个参数。那第一个参数呢?是留给find_if用的。这个函数对象binary_function派生出来的,我们看看看binary_function的定义:

 

template<class Arg1, class Arg2, class Result>

 

   struct binary_function {

 

      typedef Arg1 first_argument_type;

 

      typedef Arg2 second_argument_type;

 

      typedef Result result_type;

 

   };

 

它是一个用模版定义的类,用来对函数对象提供C++标准模版库的支持,first_argument_type 表示第一个参数类型,second_argument_type 表示第二个参数类型result_type表示返回值类型C++库的函数对象都是从这个类派生出来的。

 

说了这么多怎么用它呢:我还是给个例子吧!功能和上面的差不多,找出大于30的数。看好了!

 

#include "stdafx.h"

 

#include <iostream>

 

#include <algorithm>

 

#include <functional>

 

#include <vector>

 

#include "time.h"

 

using namespace std;

 

 

template<class T>

 

class fun: public binary_function<T, T, bool>

 

{

 

public:

 

  result_type operator() ( const first_argument_type a,const second_argument_type b ) const

 

  {

 

         return a>b;

 

  }

 

};

 

 

int _rand()

 

{

 

  return rand()%100;

 

}

 

 

int main(int argc, char* argv[])

 

{

 

  srand(time(NULL));

 

  vector<int> vec(16);

 

  generate(vec.begin(),vec.end(),_rand);

 

  copy(vec.begin(),vec.end(),ostream_iterator<int>(cout," "));

 

  cout << endl; 

 

  vector<int>::iterator itr =vec.begin();

 

  while(itr != vec.end())

 

  {

 

         itr = find_if(itr,vec.end(),binder2nd<fun<int> >(fun<int>(),30));

 

         if(itr != vec.end())

 

         {

 

                cout <<*itr << " ";

 

                itr++;

 

         }

 

  }

 

  return 0;

 

}