轉(zhuǎn)自:C++函數(shù)對象operator()-CSDN博客
函數(shù)對象:定義了調(diào)用操作符()的類對象。當(dāng)用該對象調(diào)用此操作符時,其表現(xiàn)形式如同普>通>函數(shù)調(diào)用一般,因此取名叫函數(shù)對象。
operator()
- 函數(shù)對象的實現(xiàn)主要通過在類中或者結(jié)構(gòu)體中重載()操作符
operator()
class IsNeg {
public:
bool operator()(int val) {
return val > 0 ? false: true;
}
};
- 與普通函數(shù)相比,函數(shù)對象比函數(shù)更加靈活,類isNeg 中定義了操作符 ( ),isNeg 對象調(diào)用語句在形式上跟以下函數(shù)的調(diào)用完全一樣:
int a = -1;
IsNeg isNeg
cout << isNeg(a);
函數(shù)對象的優(yōu)勢
- 函數(shù)對象可以有自己的狀態(tài)(私有變量),我們可以在類中定義狀態(tài)變量
- 函數(shù)對象有自己特有的類型。我們可以傳遞相應(yīng)的類型作為參數(shù)來實例化相應(yīng)的模板,比如說帶參數(shù)的函數(shù)形參
使用函數(shù)對象的典型例子
定義排序規(guī)則
- 在容器
set
中對string 進行排序,首先來定義相應(yīng)的類并定義operator()
來規(guī)定排序規(guī)則:
class cmp{
public:
bool operator() (const string &str1, const string &str2) const { //帶兩個參數(shù)
return str1 > str2;
}
};
set<string, cmp> myset; //帶比較函數(shù)的set構(gòu)造函數(shù),并用函數(shù)對象cmp初始化
myset.insert("A");
myset.insert("B"); // 這樣容器內(nèi)容輸出為BA
- 大根堆(有限隊列)
struct node;
struct cmp {
bool operator()(node a,node b) {
if(a.x == b.x) return a.y >= b.y;
else return a.x > b.x;
}
};
priority_queue<node, vector<node>, cmp> que; // 大根堆 堆頂是最大值
謂詞函數(shù)
-
謂詞函數(shù)
通常用來對傳進來的參數(shù)進行判斷,并返回布爾值。但是一般的函數(shù)形式固化,比如字符串長度比較只能判斷是否大于一個確定的長度值。 - 函數(shù)對象可以作為謂詞函數(shù),并可以在
類初始化時
傳遞參數(shù),如字符串長度參考值,因此函數(shù)對象比普通函數(shù)更加靈活。
現(xiàn)在假設(shè)我們有一串?dāng)?shù)字,要從中找出第一個不小于10的數(shù)字。可以定義如下相應(yīng)的類:
class Upper {
public:
Upper(int min = 0):min(min){}
bool operator() (int value) const {
return value >= min;
}
private:
int min;
};
從而這樣調(diào)用 find_if 函數(shù):
find_if(dest.begin(), dest.end(), Upper(10));
首先生成類 Upper 的對象,并用 10 初始化,調(diào)用find_if 時將用該函數(shù)對象進行判斷。