C 函式物件

2021-09-06 10:28:15 字數 1149 閱讀 6801

原文:

標準庫里的count_if可以統計容器中滿足特定條件的元素的個數。例如要統計乙個整數vector——ivec中正數的個數,可以先寫乙個返回型別為bool,含有乙個int引數的條件函式:

bool pred(int

val)

之後可以用count_if(ivec.begin(),ivec.end(),pred)計算出正整數的個數。但這個方法有乙個明顯的缺陷:如果要統計大於10的個數、大於100的個數……就要寫很多個類似的函式,能不能進一步抽象?如果能像這樣呼叫count_if:count_if(ivec.begin(),ivec.end,pred(n)),就能統計出容器裡大於n的個數,那該多好呀。函式物件提供了這樣一種機制。

簡單地說,函式物件就是乙個過載了()運算子的物件,它可以像乙個函式一樣使用。例如這個add類:

class

add};

它能夠進行加法運算。例如:

int a1=3,a2=1

;add add;

cout

《結果將是4。那麼這種機制怎樣用在剛才的問題上呢?因為count_if的第三個引數是乙個接受乙個引數的函式,所以可以通過乙個建構函式將這個引數傳到物件裡,由count_if自動呼叫這個函式物件

class

pred

bool

operator()(int

val)

};

於是,要統計大於100的個數,就可以寫成:count_if(ivec.begin(),ivec.end(),pred(100))。pred(100)構造乙個函式物件,count_if把這個物件依次應用到容器中的每乙個元素,只要它返回乙個真值,計數器就加1。

如果再利用模板技術,則可以應用到各種型別的容器上:

templateclass

pred

bool

operator

()(t val)

};

這樣,剛才的統計語句就應該寫成:count_if(ivec.begin(),ivec.end(),pred(100))。如果容器是double型別的,只需把尖括號裡的int換成double即可。

c 函式物件

標準庫里的count if可以統計容器中滿足特定條件的元素的個數。例如要統計乙個整數vector ivec中正數的個數,可以先寫乙個返回型別為bool,含有乙個int引數的條件函式 class pred 這樣,剛才的統計語句就應該寫成 count if ivec.begin ivec.end pre...

C 函式物件

標準庫里的count if可以統計容器中滿足特定條件的元素的個數。例如要統計乙個整數vector ivec中正數的個數,可以先寫乙個返回型別為bool,含有乙個int引數的條件函式 bool pred int val 之後可以用count if ivec.begin ivec.end pred 計算...

C 函式物件

函式物件實質上是乙個實現了operator 括號操作符過載 的類。它與函式指標用法一樣,但是它有乙個優點,函式指標不可以傳遞附加資料過去,但是在函式物件中,我們可以傳遞附加資料過去。先講解下運算子過載吧,對於運算子函式我們有兩種定義方式,1,如果此函式是屬於乙個類的成員函式,那麼我們是這麼定義的 參...