3

注意してください、私は答えを求めていません。なぜ物事が機能するのかについて単純に興味があります

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

問題のコード: java2s プライオリティ キューの例

operator< をオーバーロードする必要があるのはなぜですか? 比較を行うために「<」はどこで使用されていますか? 演算子のオーバーロードを実装すると、キュー STL の動作が変わりますか?

この実装は、私にはまったく直感的ではないように思えます。代わりに operator> がオーバーロードされていないのはなぜですか? priority_queue が正しく機能するために operator< をオーバーロードする必要があることをどのように学習すればよいでしょうか?

4

5 に答える 5

9

STL コンテナは、コンテンツを並べ替えるコンテナに対して、デフォルトで operator< を使用してコンテンツを並べ替えます。

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

Operator> を選択することもできましたが、1 つを選択する必要があり、それが operator< であり、一貫性のためにあらゆる場所で使用されます。

于 2009-03-26T06:05:59.657 に答える
4

なぜoperator<をオーバーロードする必要があるのですか?

Compare関数オブジェクトpriority_queue<T, Sequence, Compare>

Compareは、LessThan Comparable要件で定義されているように、引数タイプに厳密な弱順序を誘導します。

LessThanComparableドキュメント

ノート

1演算子<のみが基本です。他の不等式演算子は本質的に構文糖衣です。

2反対称関係は定理であり、公理ではありません。それは、非反射性と推移性に由来します。

[3]非反射性と推移性のため、operator<は常に半順序の定義を満たします。厳密な弱順序の定義はより厳密であり、全順序の定義はさらに厳密です。

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

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

演算子のオーバーロードを実装すると、キューSTLの動作方法が変わりますか?

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

于 2009-03-26T06:26:37.953 に答える
2

priority_queue<T>を使用しますがstd::less<T>、これは有効な式である必要T() < T()があります。メンバーである可能性も、メンバーではない可能性もありますが、式は有効である必要があります。

ただし、std::less<T>特殊化されている可能性があるため、 operator< をオーバーロードする必要があるというステートメントは少し誤解を招く可能性があります。

于 2009-03-26T10:39:20.093 に答える
1

基本的な理由は、プライオリティ キューは、挿入されたアイテムが順序関数の順序で返される構造であるためです。順序付けが必要であり、それを処理する明白な方法は、operator< をオーバーロードすることです。名前で関数を持つこともできますが、言うことができる方が、またはそのようなものif( a < b)よりも間違いなく読みやすいif(isLessThan(a,b))です。

operator>必要がないため、オーバーロードしません。プライオリティ キューで必要な唯一の操作は、less-than です。それはあなたがそれを持てなかったという意味ではありませんが、あなたは を持っているので、==それを簡単に実装することができます - または単にオペランドを逆にすることができます.

于 2009-03-26T06:09:07.997 に答える
1

参考までに: std::priority_queue は Compare 述語を受け入れることができました。
operator< は、デフォルトの動作として使用されます。最低限の要件です。

代わりに operator> がオーバーロードされないのはなぜですか

私は歴史的な理由で考えます。数学では、すべての例が通常 < 操作について説明され、他のすべての操作 ( >、<=、>=、==、!=) を定義するには 1 つの演算子で十分です。

この実装は、私にはまったく直感的ではないようです

私にとって、このインターフェースは期待されていました。癖だと思います。

演算子のオーバーロードを実装すると、キュー STL の動作が変わりますか?

いいえ、いいえ。STL キューではなく、キューのみ - 独自のコンパレータが定義されていない場合は、タイプに対して。

于 2009-03-26T06:49:36.790 に答える