本文仅作为个人学习总结。
作为STL六大组件之一的仿函数,短小、灵活,为算法提供“策略”,使STL应用更加灵活和广泛。
仿函数(functor),顾名思义,类似函数,按照最新C++标准规范,其最新名称为函数对象。
我的理解就是,仿函数就是这样的对象,它和函数类似,可以call,即具有类似函数调用的行为。
那么如何做到这一点呢?即如何定义一个对象,可以像函数一样被调用?
其实了解c++语法的同学知道函数调用时用的()操作符是可以重载的,那么我们只要重载(),下面是一个很简单的例子。
#include <iostream>
#include <algorithm>
using namespace std;
template <class T>
struct display:public unary_function<T,void>{
void operator()(const T &x){
cout << x << endl;
}
};
/*void play(const int &x){
cout << x << endl;
}*/
int main(){
int a[]={1,2,3,4,5};
for_each(a,a+5,display<int>());
system("pause");
return 0;
}
这里的display就是一个仿函数,作为for_each()的第三个参数,提供策略,即对元素的操作。
我们可以定义一个仿函数对象,如
display<int> obj1;
那么obj1就是一个函数对象,可如下使用:
obj1(3)
看上去就像函数调用一样!
其实我们发现其实也可以用函数指针传递给算法作为参数。那么为啥还要定义一个仿函数呢?
简单的说,就是仿函数是一个class template,可以融入STL大家族,搭配其他的组件。
仔细一点发现,上面的例子中,display继承了一个类,unary_function,该类存在两个型别定义,这种技巧用来使得display具有可配接的能力。
参考资料:《STL源码剖析》侯捷