C 仿函式 functor 詳解

2022-03-27 10:33:04 字數 3118 閱讀 5291

所謂的仿函式(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 ...