仿函数(functor)的概念
仿函数(functor),就是使一个类的使用看上去象一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了。仿函数新名称是函数对象function objects,一种具有函数特质的对象,
要将某种操作当作算法的参数,唯一办法是先将该操作设计为一个函数,再将函数指针当作算法的一个参数,或者将该操作设计为一个仿函数(在语言层面是个class)再以该仿函数产生一个对象,并以此对象作为算法的一个参数。在我们写代码时有时会发现有些功能的实现的代码,会不断的在不同的成员函数中用到,但是又不好将这些代码独立出来成为一个类的一个成员函数。但是又很想复用这些代码。写一个公共的函数,可以,这是一个解决方法,不过函数用到的一些变量,就可能成为公共的全局变量,再说为了复用这么一片代码,就要单立出一个函数,也不是很好维护。这时就可以用仿函数了,写一个简单类,除了那些维护一个类的成员函数外,就只是实现一个operator(),在类实例化时,就将要用的,非参数的元素传入类中。这样就免去了对一些公共变量的全局化的维护了。又可以使那些代码独立出来,以便下次复用。而且这些仿函数,还可以用关联,聚合,依赖的类之间的关系,与用到他们的类组合在一起,这样有利于资源的管理(这点可能是它相对于函数最显著的优点了)另外函数指针有时候也可以实现相同功能,但是函数指针不能满足STL对抽象性的要求,并且函数指针无法与STL其他组件如配接器搭配产生灵活变化。仿函数就是一个“行为类似函数”的对象。仿函数应该有能力被函数配接器修饰。
函数类型主要用来表现函数参数类型和返回值类型。STL仿函数,分一元二元仿函数,以功能划分, 分为算术运算,关系运算,逻辑运算。仿函数的功能主要是搭配STL算法。
代码示例:
//继承的binary_function用来呈现二元函数的两个参数类型,及返回类型
//如果是一元函数,则需要继承unary_function
#include<iostream>
using namespace std;
template<typename T>
struct add:publicbinary_function<T,T,T> {
Toperator()(const T& x,const T& y)const {eturn x+y;}
};
int main()
{
add<int>obj;
cout<<obj(4,5)<<endl;
cout<<add<int>()(3,4)<<endl;
return0;
}
注意到仿函数add本身是一个类,只是完成了函数的功能,所以叫作函数对象,他可以产生一个对象来当作普通函数使用,或者产生一个无名的临时对象来履行函数功能
STL仿函数与算法关系:
Algorithm(iv.begin(),iv.end(),greater<int>())
其中的greater<int>()就是定义的仿函数(本来这应该放函数指针)