2016-08-05 37 views
-4

在這裏,在下面的代碼中,我不明白爲什麼自定義的structre已經創建,以及重載的操作符()如何工作。如果有人幫我解決問題,對我來說這將是一個很大的幫助。 在代碼中,我嘗試在該集合中插入自定義數據類型。重載操作符()集

#include<iostream> 
#include<set> 
#include<string> 

using namespace std; 

class Person 
{ 
    public: 
     string name; 
    int id; 
    Person() 
    { 

    } 
    Person(int id, string name) 
    { 
     this->id = id; 
     this->name = name; 
    } 
    void print() const 
    { 
     cout<<"ID : "<<id <<" Name: "<<name<<endl; 
    } 
    bool operator < (const Person& P) const 
    { ///cout<<this->id<<" "<<P.id<<endl; 
     if (this->id > P.id) 
      return true; 
     return false; 
    } 
    bool operator == (const Person& P) const 
    { 
     if (this->id == P.id) 
      return true; 
     return false; 
    } 

}; 
struct custom 
{ 
    bool operator() (const Person& left,const Person& right) const 
    { 
    if(right < left) 
    { 
     if (right == left) 
      return true; 
     return true; 
    } 
    return false; 
    } 
}; 



int main() 
{ 
    set<Person,custom> s; 
    s.insert(Person(5,string("G"))); 
    s.insert(Person(1,string("A"))); 
    s.insert(Person(1,string("A"))); 
    s.insert(Person(2,string("B"))); 
    s.insert(Person(2,string("B"))); 
    s.insert(Person(3,string("C"))); 
    s.insert(Person(4,string("D"))); 
    s.insert(Person(4,string("D"))); 
    set<Person> :: iterator it = s.begin(); 
    while(it != s.end()) 
    { 
    it->print(); 
    it++; 
    } 
} 
} 
+0

一些建議:不要使用'this',只使用名稱。在'private:'標籤下封裝數據成員('name'和'id')。 –

回答

0

set<Person>添加到組或搜索元素時將使用Person::operator<比較的對象。 set<Person, custom>使用custom::operator()來比較對象。在此代碼中,custom::operator()有效返回right < left(如果您通讀了所有冗餘且令人誤解的代碼),則set<Person, custom>會創建一個集合,其順序與set<Person>創建的集合的順序相反。

注意的Person::operator<(const Person& P)身體可以更簡單地寫爲return id > P.id;,和custom::operator()身體,正如我上面提到的,簡直是right < left