Подтвердить что ты не робот

С++ меньше перегрузка оператора, какой способ использовать?

Например: в файле заголовка С++, если я определил struct Record, и я хотел бы использовать его для возможной сортировки, чтобы я хотел перегрузить less operator. Вот три способа, которые я заметил в различном коде. Я грубо заметил, что: если я собираюсь положить Record в контейнеры std::set, map, priority_queue,..., то работает версия 2 (возможно, версия 3); если я собираюсь сохранить Record в vector<Record> v, а затем вызовет make_heap(v.begin(), v.end()) и т.д., тогда будет работать только версия 1.

  struct Record
  {
      char c;
      int num;

      //version 1
      bool operator <(const Record& rhs)
      {
         return this->num>rhs.num;
      }

      //version 2
      friend bool operator <(const Record& lhs, const Record& rhs) //friend claim has to be here
      {
         return lhs->num>rhs->num;
      }
  };

в том же заголовочном файле, например:

      //version 3
      inline bool operator <(const Record& lhs, const Record& rhs)
      {
         return lhs->num>rhs->num;
      }

В принципе, я хотел бы задать здесь вопросы, чтобы узнать, может ли кто-нибудь придумать какие-то сведения о том, какие различия между этими тремя методами и каковы правильные места для каждой версии?

4b9b3361

Ответ 1

Они по сути одни и те же, кроме первого, не являющиеся константными и позволяющие вам самому модифицировать себя.

Я предпочитаю второй по двум причинам:

  • Это не должно быть friend.
  • lhs не должен быть Record

Ответ 2

Лучший способ определить меньший оператор:

struct Record{
    (...)
    const bool operator < ( const Record &r ) const{
        return ( num < r.num );
    }
};

Ответ 3

Благодарите в классе, если он не может быть в классе, потому что первый аргумент является неправильным типом.