所謂的仿函式(functor),是通過過載()運算子模擬函式形為的類。
因此,這裡需要明確兩點:
1 仿函式不是函式,它是個類;
2 仿函式過載了()運算子,使得它的對你可以像函式那樣子呼叫(**的形式好像是在呼叫
函式)。
看下面的例項:
#include
using namespace std;
const int cmp_les = -1;
const int cmp_equ = 0;
const int cmp_big = 1;
class comparer
public:
comparer(int cmptype)
m_cmptype = cmptype;
bool operator ()(int num1, int num2) const
bool res;
switch(m_cmptype)
case cmp_les:
res = num1 < num2;
break;
case cmp_equ:
res = num1 == num2;
break;
case cmp_big:
res = num1 > num2;
break;
default:
res = false;
break;
return res;
private:
int m_cmptype;
void swap(int &num1, int &num2)
int temp = num1;
num1 = num2;
num2 = temp;
void sortarray(int array, int size,const comparer &cmp)
for (int i = 0; i < size - 1; ++i)
int indx = i;
for (int j = i + 1; j < size; ++j)
if (cmp(array[indx], array[j]))
indx = j;
if (indx != i)
swap(array, array[indx]);
void listarray(int array, int size)
for (int i = 0; i < size; ++i)
cout << array << " ";
#define ary_size 10
int main()
int array[ary_size] = ;
cout << "the initial array is : ";
listarray(array, ary_size);
cout << endl;
sortarray(array, ary_size, comparer(cmp_big));
cout << "the ascending sorted array is :";
listarray(array, ary_size);
cout << endl;
sortarray(array, ary_size, comparer(cmp_les));
cout << "the descending sorted array is : ";
listarray(array, ary_size);
cout << endl;
return 0;
執行結果:
the initial array is : 10 12 9 31 93 34 98 9 1 20
the ascending sorted array is :1 9 9 10 12 20 31 34 93 98
the descending sorted array is : 98 93 34 31 20 12 10 9 9 1
程式中定義了乙個仿函式comparer,它重重載了()運算子:
comparer::bool operator ()(int num1, int num2) const;
這裡溫習一下運算子過載的方式:
ret_type operator opt(array_list);
其中,ret_type為運算子過載後返回值的型別,operator為c++運算子過載專用關健字,opt為所要過載的運算子,如+, -, *, /, , ()...
於是我們可以解讀comparer::bool operator ()(int num1, int num2) const的意義:
bool限定了()的返回值為布林型別,(int num1, int num2)指定了運算子()的引數形式,const使得應該運算子可被它的const物件呼叫。()運算子中根據m_cmptype值返回不同方式下兩整數的比較值。
函式void sortarray(int array, int size, const comparer &cmp)用於給陣列排序。其中,array指定所要排序的陣列物件,size限定陣列元素個數,cmp為comparer物件的引用,用作對元素的比較使用,前面使用const修飾是向函式呼叫都宣告,在函式內不會有修改該物件任何資料的形為。注意sortarray中的**:
if (cmp(array[indx], array[j]))
indx = j;
其中,cmp為comparer類的乙個物件,但這裡的用法好像它是某個函式的樣子。這就是仿函式的真諦。
別外,void swap(int &num1, int &num2)完成交換num1與num2值的功能。int &num1表示函式引數使用的引用,用久了c的朋友也許更習慣了void swap(int *num1, int *num2),但在c++中這個習慣要改了,引用和指標一樣高效,但引用要比指標更直觀。下面是指標版的swap函式:
void swap(int *num1, int *num2)
int temp = *num1;
*num1 = *num2;
*num2 = temp;
實現的功能與程式中使用的一模一樣,替換掉程式照樣正常工作。仔細比較引用版與指標版的swap()函式,我相信大多數人會愛上c++的引用版。
C 入門系列 仿函式 functor(精講)
來看仿函式的通俗定義 仿函式 functor 又稱為函式物件 function object 是乙個能行使函式功能的類。仿函式的語法幾乎和我們普通的函式呼叫一樣,不過作為仿函式的類,都必須過載operator 運算子。先考慮乙個應用防函式的簡單例子 假設有乙個vector,你的任務是統計長度小於5的...
stl中的仿函式functor的應用
stl中的仿函式functor的應用 在stl的泛型演算法中,functor應用甚多。template struct plus template struct minus void test 在泛型演算法中,應用甚多的是後面的那種 匿名物件 因為很多algorithm中,匿名物件的生命週期在演算法中...
C 仿函式詳解
仿函式,簡單來說,使用乙個類來實現乙個函式,通過運算子過載,使得這個類有函式的對應功能。舉個簡單仿函式實現的例子 include include using namespace std template class testfunctor dis int main for each lst,lst ...