如果一个类重载了运算符“()”,则该类的对象被称为函数对象。
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<<"
After greater<int>():";
18 sort(vec.begin(),vec.end(),greater<int>());//内置类型从大到小
19 copy(vec.begin(),vec.end(),output);
20
21 cout<<"
After less<int>():";
22 sort(vec.begin(),vec.end(),less<int>()); //内置类型小大到大
23 copy(vec.begin(),vec.end(),output);
24
25 return 0;
26 }