C ++ меньше оператор перегрузки, какой способ использовать? - PullRequest
16 голосов
/ 05 ноября 2011

Например: в заголовочном файле C ++, если я определил 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;
      }

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

Ответы [ 3 ]

5 голосов
/ 05 ноября 2011

Они практически одинаковы, за исключением того, что первый неконстантен и позволяет вам изменять себя.

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

  1. Это не обязательно должно быть friend.
  2. lhs не обязательно должно быть Record
5 голосов
/ 05 ноября 2011

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

struct Record{
    (...)
    const bool operator < ( const Record &r ) const{
        return ( num < r.num );
    }
};
0 голосов
/ 05 ноября 2011

Пользуйтесь в классе, если он не может быть в классе, поскольку первый аргумент имеет неправильный тип.

...