web-dev-qa-db-ja.com

c ++演算子のオーバーロードが少ない、どの方法を使用しますか?

たとえば、C++ヘッダーファイルで、_struct Record_を定義し、それを並べ替えに使用して_less operator_をオーバーロードしたい場合は、さまざまなコードで気付いた3つの方法を次に示します。おおまかに気づきました: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つの方法の違いは何で、各バージョンの適切な場所はどこですか?

18
user268451

最初は非定数であり、自分自身を変更できることを除いて、それらは基本的に同じです。

私は2つの理由で2番目を好む:

  1. friendである必要はありません。
  2. lhsRecordである必要はありません
5
Pubby

Less演算子を定義する最良の方法は次のとおりです。

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