たとえば、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つの方法の違いは何で、各バージョンの適切な場所はどこですか?
最初は非定数であり、自分自身を変更できることを除いて、それらは基本的に同じです。
私は2つの理由で2番目を好む:
friend
である必要はありません。lhs
はRecord
である必要はありませんLess演算子を定義する最良の方法は次のとおりです。
struct Record{
(...)
const bool operator < ( const Record &r ) const{
return ( num < r.num );
}
};