C 函式物件

2022-09-15 20:51:14 字數 1985 閱讀 6608

1、考慮下面的需求,從集合中找到乙個與當前student相等的學生,如下:

int main(int argc, char* ar**)

注意:呼叫find方法,student要過載成員操作符==,或者過載普通操作符==,因為find使用==比較兩個物件是否相等。

2、需求變更,找出乙個年齡比target大的學生,怎麼辦?

使用函式物件,函式物件有乙個成員_stu,使用target初始化_stu,過載(),比較target與序列中的每個物件

class finder

return false;

}private:

student _stu;

};iter = find_if(stuvec.begin(),stuvec.end(),finder(target));

注:假如對於teacher的集合,也要同樣的需求,找出乙個年齡比target大的教師,可以將finder修改成模板類。

3、有沒有其他的辦法呢?

使用greater可以比較student的大小,乙個是變數,乙個是參照物,而find_if的第三個引數,隱式介面是 pred(*first),只接受乙個引數。

使用bind2nd 對greater和參照物封裝,對外暴露介面接受乙個引數,對內呼叫greater(引數,參照物),greater使用》比較大小,對student進行》操作符過載。

bool operator>(const student& lhs,const student& rhs)

iter = find_if(stuvec.begin(),stuvec.end(),bind2nd(greater(),target));

4、其他辦法呢?

不過載操作符,偏特化乙個greater,用於比較age大小。如下:

template <>

struct greater: public binary_function

};iter = find_if(stuvec.begin(),stuvec.end(),bind2nd(greater(),target));

5、因為偏特化只有乙個,能不能自己寫乙個類似greater的方法物件呢,並且是可以使用bind2nd適配的。

注意:為了可適配,需要繼承 public binary_function

struct studentnamecompare: public binary_function

};iter = find_if(stuvec.begin(),stuvec.end(),bind2nd(studentnamecompare(),target));

當然也可以使用模板,如下:

template

struct studentnamecompare: public binary_function

};iter = find_if(stuvec.begin(),stuvec.end(),bind2nd(studentnamecompare(),target));

6、現在分析2的方法和5的方法,最終的介面都要滿足 pred(*first),只接受乙個引數。二者的處理策略不同。 在2中,函式物件,只接受乙個引數,但是有乙個字段,這個字段用於儲存參照物。在5中,函式物件接受兩個引數,繼承binary_function,使之可適配,然後使用bind2nd 將函式物件和參照物封裝起來,對外暴露介面只接受乙個引數。

7、考慮下面的需求,找出乙個年齡比target小的學生,對於5,只需要使用not1再次適配一下即可,如下:

iter = find_if(stuvec.begin(),stuvec.end(),not1(bind2nd(studentnamecompare(),target)));

但是對於2,不行。因為2不是可適配的,要讓2是可適配的,需要繼承 public unary_function,如下:

class finder:public unary_function

return false;

}private:

student _stu;

};當然,也可以使用模板。

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,如果此函式是屬於乙個類的成員函式,那麼我們是這麼定義的 參...