根據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(),并給予适當的參數類型
類似于下面的定義:
stl中for_each()算法大緻實作如下:
在本例中,for_each()調用printint::operator(*b);
仿函數的優點:
1.仿函數是對象,可以擁有成員函數和成員變量,即仿函數擁有狀态(states)
2.每個仿函數都有自己的類型
3.仿函數通常比一般函數快(很多資訊編譯期确定)
舉例子:現在要實作對叢集中每個元素都加上一個固定值
/**
一般函數
使用者期望在編譯期就知道這個數
*/
void add10(int& value)
{
value+=10;
}
函數模闆
需要數個不同的固定值,而它們在編譯期都已确定
stl提供了很多預定義的仿函數,如:
equal_to , not_equal_to , less , greater , less_equal , greater_equal , nagate, multiplies等
下面是幾個運作stl預先定義仿函數的例子: