正在重载集合的运算符()

overloading operator() for set

本文关键字:运算符 集合 重载      更新时间:2023-10-16

在下面的代码中,我不明白为什么要创建自定义结构以及重载运算符((是如何工作的。如果有人帮我,那对我将是一个很大的帮助。在代码中,我试图在集合中插入自定义数据类型。

#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++;
   }
 }
}

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