2017-04-22 15 views
1

私はリストにあるデータをソートしようとしています。 そして私は、私はそれでこれを行って、その種の一種ラムダ式C++を2つの条件で並べ替えます。

if a>b sort by a,b 
else if a==b sort by c,d 

を必要とするが機能していません。

l_name->sort([](type*& s1, type*& s2) 
    { 
    if (s1->a() > s2->b()) 
    return s1->a() > s2->b() 
    else if(s1->a() == s2->b()) 
    return s1->c() > s2->d(); 
    }); 

答えて

2

。ソートするには、X < YY < Xが偽であることを示す必要があります。

は、これら2つのオブジェクト考えてみましょう。あなたがそれらを比較する方法

Name a b 
---- - - 
X 2 1 
Y 2 1 

どんなに、X > YまたはY > Xを、あなたはtrueになるだろう、X.a > Y.bY.a > X.bので。

でも、X > XおよびY > Yは決して発生してはならないtrueを生成します。

そのため、同じ属性を比較するという点で比較ルールを定義する必要があります。そうしないと、反射性と推移性のルールが破られます。

1

どうすればa < b?あなたは、より堅牢かつ簡潔にこの問題を解決することができます:それは定義されて仕分けルールは、内部で矛盾しているので、あなたは、そのような比較関数でソートすることはできません

l_name->sort([](type*& s1, type*& s2) 
    { 
     if (s1->a() != s2->b()) 
      return s1->a() < s2->b(); 

     return s1->c() < s2->d(); 
    }); 
+1

これは未定義の動作をカバーしますが、一貫性がありません。 – dasblinkenlight

関連する問題