2012-01-19 3 views
5

として:不平等の比較においてグローバル不等式比較<><a href="http://www.cplusplus.com/reference/std/utility/pair/" rel="nofollow">cppreference</a>に従ってC++標準

(<、>)、第一要素は 最初に比較され、不等式比較が真でない場合にのみそれらのために、 第2要素が比較されます。このような何かに変換

return ((a.first < b.first) || (!(b.first < a.first) && (a.second < b.second))); 

私quesionはそれはとても直感的である理由、ありますか? その背後にある理由は何ですか?そして、この推論が正解につながる例がありますか?

私は実装が簡単になります考えた:

return a.first < b.first && a.second < b.second 

答えて

12

比較のこの種は、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に格納することもできませんでした。

希望すると便利です。

+0

私が探していた説明(+1) – Samaursa

6

a.first未満b.firstである場合には、ペアが少ないすでにあります。 2番目の部分を比較する理由はありません。ペアは、名前が最初の文字で最初にソートされるのと同じように、暗黙のうちに最初の部分で最初にソートされます。 "A"は "Z"の前に来るので "Apple"は "Zebra"の前に来るので、 "p"と "e"を全く比較しない。

だからa.first < b.firstとすれば完了です。しかし、そうでなければ、私たちはやっていない。別の方法がありますabより小さくすることができます。 b.first < a.firstが該当しない場合は、a.second < b.secondです。

「ゼブラ」と「ザイマン」の類推があります。 "Z"は "Z"より小さくはないが、 "e"は "y"よりも小さいので、最初のものは2番目のものよりも小さい。あなたは時にはそれがこのようにコード化された表示されます

bool operator<(const foo& a, const foo& b) { 
if (a.first < b.first) return true; 
if (a.first > b.first) return false; 
return (a.second < b.second); 
} 

私はこれを簡単に直感的に理解するために見つけることが、ロジックは同じです:

+0

上記の答えに+1を加えてください。 – Samaursa

4

直感性は、見る人の目の前にあります。私は実際に自分自身を直感的に見いだしています。

他のシーケンスを比較しているときと同じように動作します。たとえば、文字列"az""ba"の前に来るとしますか?しかし、あなたは'a' < 'b' && 'z' < 'a'を持っていない!ペアについても同じ理由が適用されます。より直観的であるだけでなく、そのような関係の望ましい特性もすべて維持します。

+0

"az"と "ba"の良い点。 (+1) – Samaursa

関連する問題

 関連する問題