(原創) 如何使用Function Object? (C/C++) (STL)

时间:2022-09-01 18:33:08

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

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

 1 (原創) 如何使用Function Object? (C/C++) (STL)(原創) 如何使用Function Object? (C/C++) (STL) /* 
 2(原創) 如何使用Function Object? (C/C++) (STL)(C) OOMusou 2007 http://oomusou.cnblogs.com
 3(原創) 如何使用Function Object? (C/C++) (STL)
 4(原創) 如何使用Function Object? (C/C++) (STL)Filename    : FunctionObjectSimple.cpp
 5(原創) 如何使用Function Object? (C/C++) (STL)Compiler    : Visual C++ 8.0 / ISO C++
 6(原創) 如何使用Function Object? (C/C++) (STL)Description : Demo how to use use Function Object
 7(原創) 如何使用Function Object? (C/C++) (STL)Release     : 01/18/2007 1.0
 8(原創) 如何使用Function Object? (C/C++) (STL)*/

 9 (原創) 如何使用Function Object? (C/C++) (STL)#include  < iostream >
10 (原創) 如何使用Function Object? (C/C++) (STL)#include  < vector >
11 (原創) 如何使用Function Object? (C/C++) (STL)#include  < algorithm >
12 (原創) 如何使用Function Object? (C/C++) (STL)
13 (原創) 如何使用Function Object? (C/C++) (STL) using   namespace  std;
14 (原創) 如何使用Function Object? (C/C++) (STL)
15 (原創) 如何使用Function Object? (C/C++) (STL) bool  biggerThan3( int );
16 (原創) 如何使用Function Object? (C/C++) (STL)
17 (原創) 如何使用Function Object? (C/C++) (STL) //  Function Object
18 (原創) 如何使用Function Object? (C/C++) (STL)(原創) 如何使用Function Object? (C/C++) (STL) struct  biggerThan  {
19(原創) 如何使用Function Object? (C/C++) (STL)  int n;
20(原創) 如何使用Function Object? (C/C++) (STL)(原創) 如何使用Function Object? (C/C++) (STL)  biggerThan(int n) : n(n) {} // Constructor
21(原創) 如何使用Function Object? (C/C++) (STL)(原創) 如何使用Function Object? (C/C++) (STL)  bool operator() (int val) return val > n; }
22(原創) 如何使用Function Object? (C/C++) (STL)}
;
23 (原創) 如何使用Function Object? (C/C++) (STL)
24 (原創) 如何使用Function Object? (C/C++) (STL)(原創) 如何使用Function Object? (C/C++) (STL) int  main()  {
25(原創) 如何使用Function Object? (C/C++) (STL)(原創) 如何使用Function Object? (C/C++) (STL)  int ia[] = {12345};
26(原創) 如何使用Function Object? (C/C++) (STL)  vector<int> ivec(ia, ia + sizeof(ia) / sizeof(int));
27(原創) 如何使用Function Object? (C/C++) (STL)  int i = count_if(ivec.begin(), ivec.end(), biggerThan3);
28(原創) 如何使用Function Object? (C/C++) (STL)  cout << i << endl;
29(原創) 如何使用Function Object? (C/C++) (STL)  int j = count_if(ivec.begin(), ivec.end(), biggerThan(3));
30(原創) 如何使用Function Object? (C/C++) (STL)  cout << j << endl;
31(原創) 如何使用Function Object? (C/C++) (STL)}

32 (原創) 如何使用Function Object? (C/C++) (STL)
33 (原創) 如何使用Function Object? (C/C++) (STL)(原創) 如何使用Function Object? (C/C++) (STL) bool  biggerThan3( int  val)  {
34(原創) 如何使用Function Object? (C/C++) (STL)  return val > 3;
35(原創) 如何使用Function Object? (C/C++) (STL)}


執行結果

(原創) 如何使用Function Object? (C/C++) (STL)2
(原創) 如何使用Function Object? (C/C++) (STL)
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帶多少都可以,當然更有彈性了。

See Also
(原創) 如何正確的使用迴圈(使用for_each)? (中級) (C++) (STL) (OO C++) (Template C++)
(原創) 如何為程式碼加上行號? (C/C++) (STL)