1.2 仿函數(shù)(function call操作符)

從函數(shù)指針到仿函數(shù)。

1.1 函數(shù)調(diào)用操作符(C++語法中的左右括號)也可以被重載。

許多STL算法都提供了兩個版本,一個用于一般狀況(例如排序時以遞增方式排列),一個用于特殊狀況(例如排序時由使用者指定以何種特殊關(guān)系進(jìn)行排列)。像這種情況,需要用戶指定某個條件或策略,而條件或策略的背后由一整組操作構(gòu)成,便需要某種特殊的東西來代表這“一整組操作”。
   代表“一整組操作”的,是函數(shù)。在舊式C語言中,欲將函數(shù)當(dāng)做參數(shù)傳遞,唯有通過函數(shù)指針才能達(dá)成。例子如下:

#include <cstdlib>
#include <iostream>
using namespace std;

int fcmp(const void* elem1, const void* elem2);

int main(){
    int ia[10] = {32, 97, 62, 22, 43, 25, 52, 59, 54, 9};
    
    for (int i=0; i<10; i++)
        cout << ia[i] << " ";
        
    cout << endl;
    
    qsort(ia, sizeof(ia)/sizeof(int), sizeof(int), fcmp);
    
    for (int i=0; i<10; i++)
        cout << ia[i] << " ";
    
    return 0;
}

int fcmp(const void* elem1, const void* elem2){
    const int* i1 = (const int*)elem1;
    const int* i2 = (const int*)elem2;
    
    if(*i1 < *i2)
        return -1;
    else if(*i1 == *i2)
        return 0;
    else if(*i1 > *i2)
        return 1;    
}

  函數(shù)指針的缺點:無法持有自己的狀態(tài)(局部狀態(tài)),也無法達(dá)到組件技術(shù)中的可適配性——也就是無法再將某些修飾條件加諸于其上而改變其狀態(tài)。

1.2 為此,引入仿函數(shù)的概念。STL算法的特殊版本所接受的所謂“條件”或“策略”或“一整組操作”,都以仿函數(shù)形式呈現(xiàn)。

針對某個class進(jìn)行operator()重載,它就成為一個仿函數(shù)。
  例子如下:

#include <iostream>
using namespace std;

// 由于將operator()重載了,因此plus成為了一個仿函數(shù)
template <class T>
struct PLUS {
    T operator() (const T& x, const T& y) const {return x + y;}
};

// 由于將operator()重載了,因此minus成為了一個仿函數(shù)
template <class T>
struct MINUS {
    T operator() (const T& x, const T& y) const {return x - y;}
};

int main(){
    // 產(chǎn)生仿函數(shù)對象
    PLUS<int> plusObj;
    MINUS<int> minusObj;
    
    // 使用仿函數(shù),就像使用一般函數(shù)一樣
    cout << plusObj(3, 5) << endl;
    cout << minusObj(3, 5) << endl << endl;
    
    // 直接產(chǎn)生仿函數(shù)的臨時對象(第一對小括號),并調(diào)用(第二對小括號)
    cout << PLUS<int>() (7, 6) << endl;
    cout << MINUS<int>() (7, 6) << endl;
}

  上述的 PLUS<T> 和 MINUS<T> 已經(jīng)非常接近STL的實現(xiàn)了,唯一的差別在于它缺乏“可適配能力”。

1.3 如果要成為一個可適配的仿函數(shù)呢?

將在讀完第8章再進(jìn)行總結(jié)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容