C 函式物件

2021-05-24 13:25:37 字數 855 閱讀 7749

標準庫里的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;

coutbool operator()(int val)...

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

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

template

class 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 函式物件

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

C 函式物件

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