天天看點

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預先定義仿函數的例子: