天天看点

c++ founction object

根据sgi官方文档,仿函数也叫函数对象(function object, or functor),定义就是任何可以像函数一样被调用的对象。一个普通的函数是函数对象,一个函数指针当然也是,广义上说任何定义了operator()的类对象都可以看作是函数对象。

仿函数(functor、function object)

传递给stl算法的函数型参数(functional arguement)不一定要是函数,可以是行为类似于函数的对象,即function object或者functor。

stl中大量运用了function object,也提供了很多预先定义的function object。

如果你定义了一个对象,其行为像函数,就可以拿来当函数使用。

那么什么才算具备函数行为呢?

函数行为:是指可以使用小括号传递参数,籍以调用某个东西

如:function(arg1,arg2);

在c++中要实现这个,你只要定义operator(),并给予适当的参数类型

类似于下面的定义:

c++ founction object

stl中for_each()算法大致实现如下:

在本例中,for_each()调用printint::operator(*b);

仿函数的优点:

1.仿函数是对象,可以拥有成员函数和成员变量,即仿函数拥有状态(states)

2.每个仿函数都有自己的类型

3.仿函数通常比一般函数快(很多信息编译期确定)

举例子:现在要实现对集群中每个元素都加上一个固定值

/**

一般函数

用户期望在编译期就知道这个数

*/

void add10(int& value)

{

    value+=10;

}

函数模板

需要数个不同的固定值,而它们在编译期都已确定

c++ founction object

stl提供了很多预定义的仿函数,如:

equal_to , not_equal_to , less , greater , less_equal , greater_equal , nagate, multiplies等

下面是几个运行stl预先定义仿函数的例子: