比較のこの種は、lexicographical orderingと呼ばれ、 2つの異なる順序を1つに結合するより自然な方法の1つです。
C++で要求される順序は、strict weak orderingsと呼ばれます。これは、次が真でなければならないことを意味します
- Irreflexivity: X < xは常にfalseです。
- 可換性: x <yおよびy <zの場合、x <zです。
- 反対称性: x < yの場合、y < xは常にfalseです。
- 等価性の可換性:xとyが比例できず、yとzが比例できない場合、xとzは比例しません。
これらのプロパティは、オブジェクトのリストを取得してソートされた昇順に並べ替えるために必要なものです。つまり、std::sort
を使用するか、std::set
に保存することができます。
2つの厳密な弱い順序がある場合、それらを組み合わせることによって得られる辞書順は、厳密に弱い順序であることを数学的に証明できます。辞書順は、厳密な弱い順序を組み合わせて新しい厳密な弱い順序を作ることができるいくつかの方法の1つです。
しかし、あなたが提案した注文はではありません。は厳密な弱い注文であり、特定の前提条件が壊れてしまいます。特に、ペア(0,5)、(3,3)、(1,6)を考慮する。それで(0,5)は(3,3)とは比較できず、(3,3)は(1,6)と比較できない。しかし、実際には(0、5)<(1、6)という規則があり、それはの等価性の譲渡性を打ち破る。。その結果、同値が推移的であると仮定する多くのソートアルゴリズム(ほとんどの主要ソートアルゴリズムを含む)は、範囲で正しく機能しません。つまり、std::sort
が正しく動作しない可能性があります。 std::set
は何らかの種類のソート順(通常はバランスのとれたバイナリ検索ツリー)をすべて格納するため、完全に間違った結果になる可能性があるため、std::set
に格納することもできませんでした。
希望すると便利です。
私が探していた説明(+1) – Samaursa