函数对象

如果一个类重载了运算符“()”,则该类的对象被称为函数对象。

clas CMyAverage{
public:
    double operator()(int a1,int a2,int a3){
            return  (double)(a1+a2+a3)/3;
    }
};
CMyAverage  average; //函数对象
cout<<average(3,2,3); // average.operator()(3,2,3)
输出2.666672020-07-08

可调用对象:函数名,函数指针,lambda表达式,bind创建的对象,重载了函数调用运算符的类的对象(函数对象)

函数对象的应用:

Accumulate源代码1: //第三个参数的类型决定了返回值的类型

template <class _InputIterator, class _Tp>     
_Tp  accumulate(_InputIterator __first, _InputIterator __last, _Tp __init)
{
    for (; __first != __last; ++__first)
        __init = __init + *__first;
    return __init;
}
// typename等价于class

Accumulate源代码2:

template <class _InputIterator, class _Tp, class _BinaryOperation>
   T accumulate (_InputIterator _first, _InputIterator _last, _Tp _init,
                 _BinaryOperation _binary_op)
{  
    for(;_first!=_last;++_first)
        _init = _binary_op(_init,*first);
    return _init;
  }
//调用Accumulate时,和_binary_op对应的实参可以是函数,函数指针,函数对象。

greater函数对象类模板

 

 

 1 #include<iostream>
 2 #include<vector>
 3 #include<iterator>
 4 #include<functional>
 5 #include<algorithm>
 6 using namespace std;
 7  
 8 int main()
 9 {
10     int A[]={1,4,3,7,10};
11     const int N=sizeof(A)/sizeof(int);
12     vector<int> vec(A,A+N);
13     ostream_iterator<int> output(cout," ");
14     cout<<"Vector vec contains:";
15     copy(vec.begin(),vec.end(),output);
16     
17     cout<<"\nAfter greater<int>():";
18     sort(vec.begin(),vec.end(),greater<int>());//内置类型从大到小 
19     copy(vec.begin(),vec.end(),output);
20     
21     cout<<"\nAfter less<int>():";
22     sort(vec.begin(),vec.end(),less<int>());   //内置类型小大到大 
23     copy(vec.begin(),vec.end(),output);
24     
25     return 0;
26 }

 

posted @ 2020-07-08 16:25  wsl96  阅读(104)  评论(0编辑  收藏  举报