2009-03-26 5 views
3

メモ、私は答えを求めていません。なぜ私は物事がうまくいくのか不思議です。C++でクラスベースの優先度キューを実装するときにoperator <をオーバーロードする必要があるのはなぜですか?

クラス割り当てのためにプリンタシミュレータの優先度キューを実装する必要があります。インターネット上の例を見て、優先度キューを正しく配置するために、演算子<がオーバーロードされていることに気付きました。

code in question: java2s priority queue example

なぜオペレータ<が過負荷状態にする必要があるのでしょうか?比較を行うのに '<'はどこに使われていますか?演算子のオーバーロードを実装すると、キューSTLの動作が変化しますか?

この実装は私には直感的ではないように見えます。なぜ、演算子>がオーバーロードされていないのですか? priority_queueが正しく動作するためには、演算子<をオーバーロードする必要があることをどのようにして知っていますか?

+1

ドキュメント**を読んで、演算子<()をオーバーロードする(または別のコンパレータを用意する)必要があることを理解しています。あなたの他の質問に関しては、これらは他者の答えによって十分にカバーされています。 –

答えて

9

STL容器は、内容を注文するコンテナに対して、デフォルトでオペレータ<を使用して内容を注文します。

コンテナのコンストラクタに比較ファンクタを渡すことで、これをオーバーライドすることができます。これにより、コンテナオブジェクトから並べ替え/並べ替えを切り離すことができます。

オペレータ>を選択できましたが、オペレータ<であったため、一貫性のためにどこでも使用されていました。

1

基本的な理由は、優先度キューは、挿入されたアイテムが何らかの順序機能の順に返される構造であるということです。注文が必要で、それを処理する明白な方法は、オペレータ<をオーバーロードすることです。あなたは名前で関数を持つことができますが、if(a < b)と言うのは間違いなくif(isLessThan(a,b))またはそのようなものよりも読みやすくなります。

operator>は必要ないのでオーバーロードしないでください。優先度キューで必要な操作は、より小さいです。これはあなたがにはがありませんでしたが、==があることを意味するわけではありません。

4

なぜオペレータ<を過負荷にする必要がありますか? priority_queue<T, Sequence, Compare>

Compare関数オブジェクト:

は、その引数の型に、LessThan同等の要件で定義されるように、厳密な弱い順序を誘発比較します。

LessThanComparable documentation

ノート

1のみオペレータ<が基本です。他の不等式演算子は本質的に統語的な砂糖です。

2逆称性は定理であり、公理ではありません。それは、非再帰性と推移性から来ます。

[3]非再帰性と過渡性のため、演算子<は、部分順序の定義を常に満たします。厳密な弱い順序付けの定義はより厳しく、全体の順序付けの定義は依然として厳しいものです。

「<」は比較を行うために使用されますか?

void push(const value_type& x)これはキューに値を挿入します。

オペレータのオーバーロードを実装すると、キューSTLの動作が変更されますか?

はい、もちろんです。比較の要素の順序を入れ替えると、あなたの並べ替えは逆になります。

1

FYI:std :: priority_queueはCompare述部を受け入れることができます。
オペレータ<がデフォルト動作として使用されます。これは最低限の要件です。

なぜ私は歴史的reaqsonsで考える 代わり

をオーバーロードされている>演算子ではありません。数学的には、すべての例は通常<の操作で記述され、1つの演算子で他のすべての操作(>、< =、> =、==、!=)を定義すれば十分です。

この実装では、私には直感的 このインタフェースが期待されていた私にとっては、すべての

でいないようです。私はハビットだと思う。

は道キューSTL 作品を変更するオペレータ オーバーロードを実装していますか?

いいえ、いいえ。 STLキューではなく、独自のコンパレータが定義されていない場合は、自分のキューのキューのみです。

2

priority_queue<T>std::less<T>を使用し、T() < T()は有効な式である必要があります。メンバーでも非メンバーでもかまいませんが、式は有効でなければなりません。

ただし、std::less<T>は特殊な場合がありますので、オペレータ<に過負荷をかけなければならないという記述は、誤解を招く可能性があります。

関連する問題