2007/03/12

Function Object

很淺顯易懂的釋例...

轉錄自http://www.cnblogs.com/oomusou/archive/2007/01/18/623299.html
台灣大學電機所研究生 蕭鴻森 Clare



很多STL algorithm都是_if結尾的,讓我們可以帶function進去,若配合function object,可讓function更有彈性!!

以下的範例想利用count_if() algorithm得知vector大於n的有幾個?


/*
(C) OOMusou 2007 http://oomusou.cnblogs.com

Filename : FunctionObjectSimple.cpp
Compiler : Visual C++ 8.0 / ISO C++
Description : Demo how to use use Function Object
Release : 01/18/2007 1.0
*/
#include
#include
#include

using namespace std;

bool biggerThan3(int);

// Function Object
struct biggerThan {
int n;
biggerThan(int n) : n(n) {} // Constructor
bool operator() (int val) { return val > n; }
};

int main() {
int ia[] = {1, 2, 3, 4, 5};
vector ivec(ia, ia + sizeof(ia) / sizeof(int));
int i = count_if(ivec.begin(), ivec.end(), biggerThan3);
cout << i << endl;
int j = count_if(ivec.begin(), ivec.end(), biggerThan(3));
cout << j << endl;
}

bool biggerThan3(int val) {
return val > 3;
}

執行結果
2
2

若沒有function object,我們就只能帶一個function name進去,由於其signature是固定的,

所以只能帶進如33行那樣固定n的function,但STL algorithm還允許我們帶function object進去,

若能用function object,就很有彈性了,18~22行將function包成function object,當然用class也行,

但若用struct可以省去public:字眼,首先用constructor接下參數,然後對() operator做overload,

這樣29行就可以帶參數進去,無論n帶多少都可以,當然更有彈性了。

No comments:

Post a Comment