理解仿函式

Andy Niu發表於2013-12-10

1、考慮下面的需求,vector中放置Person,Person有age和name欄位。在vector中查詢第一個Person c,這個很簡單,方法如下:

  vector<Person>::iterator iter = find(personVector.begin(),personVector.end(),c);

  注意:find演算法使用操作符==,比較物件是否相等,需要提供==過載。

2、考慮下面的需求,在vector中查詢第一個age>15的Person。使用find_if和仿函式。如下:

  iter = find_if(personVector.begin(),personVector.end(),GetBigAgeFunctor(15));

3、完整程式碼如下:

Person.h

 1 #ifndef PERSON_H__
 2 #define PERSON_H__
 3 
 4 #include <string>
 5 #include <iostream>
 6 using namespace std;
 7 
 8 class Person
 9 {
10 private :
11     int age;
12     string name;
13 
14 public :
15     Person();
16 
17     Person(const int& age,const string& name);
18 
19     int GetAge() const;
20 
21     void SetAge(const int& age);
22 
23     string GetName() const;
24 
25     void SetName(const string& name);
26 
27     bool operator==(const Person& rhs);
28 
29     operator int() const;
30 
31 };
32 #endif
View Code

Person.cpp

 1 #include <string>
 2 #include "stdafx.h"
 3 
 4 Person::Person()
 5 {    
 6 }
 7 
 8 Person::Person(const int& age,const string& name):age(age),name(name)
 9 {
10 }
11 
12 int Person::GetAge() const
13 {
14     return this->age;
15 }
16 
17 void Person::SetAge(const int& age)
18 {
19     this->age = age;
20 }
21 
22 string Person::GetName() const
23 {
24     return this->name;
25 }
26 
27 void Person::SetName(const string& name)
28 {
29     this->name = name;
30 }
31 
32 bool Person::operator==(const Person& rhs)
33 {
34     return this->name == rhs.GetName() && this->age == rhs.GetAge();
35 }
36 
37 Person::operator int() const
38 {
39     return this->age;
40 }
View Code

main.cpp

 1 class GetBigAgeFunctor
 2 {
 3 private:
 4     int age;    
 5 
 6 public:
 7     GetBigAgeFunctor(const int& age):age(age)
 8     {
 9     }
10 
11     bool operator()(const Person& person)
12     {
13         return person>age;
14     }
15 };
16 
17 
18 int _tmain(int argc, _TCHAR* argv[])
19 {
20     Person a(13,"Andy");
21     Person b(8,"Bill");
22     Person c(27,"Caroline");
23     Person d(3,"David");
24 
25     vector<Person> personVector;
26     personVector.push_back(d);
27     personVector.push_back(a);
28     personVector.push_back(c);
29     personVector.push_back(b);
30 
31     vector<Person>::iterator iter = find(personVector.begin(),personVector.end(),c);
32 
33     iter = find_if(personVector.begin(),personVector.end(),GetBigAgeFunctor(15));
34 
35 }
View Code

4、操作符過載分為普通操作符和成員操作符,相對於普通操作符,成員操作符少了一個左運算元,成員操作符的左運算元就是成員方法中的this。
5、操作符過載,仿函式,隱式型別轉換操作符分別為:  

  bool operator==(const Person& rhs)   操作符過載,可以認為operator== 就是方法名。

  bool operator()(const Person& person) 仿函式可以認為是一種特殊的操作符過載,也就是過載了操作符()

  operator int() const; 隱式型別轉換操作符,可以認為沒有形參,沒有返回型別(類似構造方法),好像是過載了int  

  注意:一般情況下,不要使用隱式型別轉換(構造方法加上explicit),也不要提供隱式型別轉換操作符(可以提供AsXXX方法),因為他們實現了不合理的需求。

相關文章