2017-04-22 122 views
1

我正在嘗試對列表中的數據進行排序。 我需要的那種類型的由兩個條件對Lambda表達式C++進行排序

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 < Y必須暗示Y < X是錯誤的。

考慮這兩個對象:

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

不管你如何對它們進行比較,X > YY > X,你會得到true,因爲X.a > Y.bY.a > X.b

即使X > XY > 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