通过两个条件对Lambda Expression C ++进行排序

时间:2017-04-22 09:53:29

标签: c++ list sorting lambda

我正在尝试对列表中的数据进行排序。 我需要那种

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 个答案:

答案 0 :(得分: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 :(得分: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();
    });