2016-08-05 18 views
-4

Hier im unten Code verstehe ich nicht, warum die benutzerdefinierte Struktur erstellt wurde und wie der überladene operator() funktioniert.Es wäre eine große Hilfe für mich, wenn mir jemand helfen. Hier im Code habe ich versucht, den benutzerdefinierten Datentyp in den Satz einzufügen.overloading operator() für set

#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

Einige Empfehlungen: Verwenden Sie 'this' nicht, verwenden Sie nur den Namen. Verkapseln Sie Ihre Datenelemente ('name' und' id') unter dem Tag 'private:'. –

Antwort

0

set<Person> verwenden würde Person::operator< Objekte zu vergleichen, wenn für ein Element zu der Menge oder die Suche hinzugefügt wird. set<Person, custom> verwendet custom::operator(), um Objekte zu vergleichen. In diesem Code gibt custom::operator() effektiv right < left zurück (wenn Sie den redundanten und irreführenden Code durchlesen), so erstellt set<Person, custom> ein Set, dessen Reihenfolge das Gegenteil des von set<Person> erstellten Sets ist.

Beachten Sie, dass der Körper von Person::operator<(const Person& P) viel einfacher als return id > P.id; geschrieben werden kann, und der Körper von custom::operator(), wie ich oben erwähnt, ist einfach right < left.