5

cppreferencestd::minの stlでの実装は次のようになります。

return (b < a) ? b : a;

しかし、これは少し読みやすいと思います:

return (a < b) ? a : b;

どちらの実装も同等ですか? このように実装されている特定の理由はありますか?

4

3 に答える 3

6

2 つの異なる実装により、最初のオブジェクトと 2 番目のオブジェクトのどちらを最小として選択するかが決定されます。

これは、他のいくつかのアルゴリズムの実装と相まって、より大きな影響を与える可能性があります. たとえば、ソート アルゴリズムmin(a[i], a[j])で wherei < ja[i]anda[j]が同じ値を使用する場合、最初の実装では要素間のスワップが発生しませんが、2 番目の実装ではスワップが発生し、ソートが不安定になります。


注: BoBTFishが述べたように、C++11 標準では、最小値と最大値の両方が左端の最小値を返すことが保証されています。

25.4.7:

3備考:引数が等しい場合、最初の引数を返します

6備考:複数の引数が最小の引数と等しい場合、最も左の引数のコピーを返します。

于 2013-06-13T13:59:16.107 に答える
5

実装は同じではありません。a と b が等しい場合、どちらの実装でもどうなりますか? 1 つは a への参照を返し、1 つは b への参照を返します。もちろん、値は同じです。しかし、compare 関数が 1 つの値のみを考慮し、他のいくつかの値が異なる構造体を考えてみましょう。これは、安定した並べ替えを保証しようとする並べ替え関数に劇的な影響を与える可能性があります。

最終的にはスタイルの選択です。等しい場合、最初または 2 番目のパラメーターを返す必要がありますか? ただし、このスタイルの選択が行われた今、それが同じままであることが非常に重要です。これが、標準定義のようなものが存在する理由です!

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf

最大値と最小値については「25.4.7」で検索してください。

于 2013-06-13T13:59:08.650 に答える
-2

-- 不正解 -- コメントを参照 -- bb

FWIW、必ずしも STL が特に読みやすいように書かれているというのは私の観察ではありませんが、美しくシンプルです。この場合、同じ結果を得る唯一の方法は次のとおりです。

return (a <= b) ? a : b;

これはもう1文字になり、実際には読みにくいです。さらに、ソートの安定性に関する上記の @Shahbaz の解説を参照してください。 min などの操作には、包括性と排他性について明確に定義された動作があります。

TL;DR 「未満」は「以下」と同じではないため

以下のコメントを参照してください。この回答は C のマクロとしては正しいですが、以下のコメントで説明されている理由により、C++ では実際には正しくありません。これは間違っているとマークしていますが、コメントは有用であり、理解することが重要であるため、そのままにしておきます。この問題を混乱させてしまった場合は、お詫び申し上げます。

于 2013-06-13T14:26:58.687 に答える