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
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 }
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 }
4、操作符過載分為普通操作符和成員操作符,相對於普通操作符,成員操作符少了一個左運算元,成員操作符的左運算元就是成員方法中的this。
5、操作符過載,仿函式,隱式型別轉換操作符分別為:
bool operator==(const Person& rhs) 操作符過載,可以認為operator== 就是方法名。
bool operator()(const Person& person) 仿函式可以認為是一種特殊的操作符過載,也就是過載了操作符()
operator int() const; 隱式型別轉換操作符,可以認為沒有形參,沒有返回型別(類似構造方法),好像是過載了int
注意:一般情況下,不要使用隱式型別轉換(構造方法加上explicit),也不要提供隱式型別轉換操作符(可以提供AsXXX方法),因為他們實現了不合理的需求。