STL學習筆記(六) 函數對象

條款38:遵循按值傳遞的原則來設計仿函數

仿函數都是 pass-by-valueless

Function for_each(InputIterator first, InputIterator last, Function f); //f按值傳遞, 結果按值返回

函數對象按值傳遞和按值返回,因此函數對象要儘量小(對象拷貝開銷大)函數

 

條款39:確保判別式是"純函數"

 

 

條款40:若一個類是仿函數,則應使它可配接

 

條款41:理解ptr_fun、mem_fun、mem_fun_ref

 

template<typename InputIterator, typename Function>
Function for_each(InputIterator first, InputIterator last, Function f) {                                
    while (first != last)    f(*begin++);
}

一個函數f和一個對象x,若是在x對象調用f,則:
f(x); //f是一個非成員函數
x.f(); //f是成員函數,且x是一個對象或對象引用
x->f(); //f是成員函數,且x是指向對象x的指針測試

如今有一個用於測試Widget對象的非成員函數:
bool test(Widget& widget);
和一個存放Widget對象的容器: std::vector<Widget> vec;
咱們能夠使用: for_each(vec.begin(), vec.end(), test);spa

如今假設test函數是Widget的成員函數,即Widget支持自測:設計

class Widget {
public:
    void test();
};

若是咱們以下調用:指針

for_each(vec.begin, vec.end(), &Widget::test);    //編譯錯誤!!! 

mem_fun:若是一個存放Widget*的指針容器,須要調用本身定義的成員函數時:code

for_each(vecptr.begin(), vecptr.end(), mem_fun(&Widget::test));

mem_fun_ref:若是一個存放Widget的容器,須要調用本身定義的成員函數時:對象

for_each(vec.begin(), vec.end(), mem_fun_ref(&Widget::test));
條款42:確保less<T>與 operator< 具備相同語義
相關文章
相關標籤/搜索