2016-08-05 6 views
-4

のオーバーロード演算子()以下のコードでは、カスタム構造体が作成された理由と、オーバーロードされた演算子()の働きを理解できません。 ここでコードでは、カスタムデータ型をセットに挿入しようとしました。セット

#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であることに注意してください。