2017-04-22 84 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