天天看點

C++文法基礎--函數對象,函數對象的函數擴充卡(綁定器,求反器)

1.定義了調用操作符的類,其對象稱為函數對象,即它們是行為類似函數的對象

  Example:

      class abs

{

   public:

      int operator()(int i)

      {

          return i>=0?i:-i;

      }

};

int main()

{

  abs ob;  

  cout<<ob(-1)<<endl; //1

   return 0;

 };

2.标準庫定義的函數對象

  頭檔案#include<functional>

C++文法基礎--函數對象,函數對象的函數擴充卡(綁定器,求反器)

  Tips:

     *每個類表示一個給定操作符

    *每個函數對象類都是一個類模闆

   Example:

     int main()

{

    plus<int> add;

    cout<<add(1,1)<<endl;//2

    return 0;

 };

3.在範型算法中使用标準函數對象

   *函數對象常用于覆寫算法使用的預設操作符

   Example:

   int main()

{

   int arr[]={3,1,4,2,5};

   vector<int> vec(arr,arr+5);

   sort(vec.begin(),vec.end(),greater<int>()); 

  for(vector<int>::iterator it=vec.begin();it!=vec.end();it++)

   {

       cout<<*it<<"\t"; //5 4 3 2 1

    } 

   return 0;

 };

4.函數對象的函數擴充卡

  作用:用于特化和擴充一進制和二進制函數對象

  *綁定器:每個綁定其接受一個函數對象和一個值

    bind1st:将定值綁定到二進制函數對象的第一個實參

    bind2nd:将定值綁定到二進制函數對象的第二個實參

 int main()

{

   int arr[]={3,1,4,2,5};

   int res;

   res=count_if(arr,arr+5,bind2nd(greater<int>(),2)); 

   cout<<res<<endl; //3

   return 0;

 };

   *求反器:将函數對象的真值求反

     not1:将一進制函數對象的真值求反

     not2:将二進制函數對象的真值求反

 Eample:

int main()

{

   int arr[]={3,1,4,2,5};

   int res;

   res=count_if(arr,arr+5,not1(bind2nd(greater<int>(),2))); 

   cout<<res<<endl;//2

   return 0;

 };