按两个条件对lambda表达C 进行排序

Sort Lambda Expression C++ by two condition

本文关键字:表达 lambda 排序 条件 两个      更新时间:2023-10-16

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

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();
    });

您无法使用这样的比较函数进行排序,因为它定义的分类规则在内部不一致。为了排序,X < Y必须暗示Y < X是FALSE。

考虑这两个对象:

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

无论您如何比较它们,X > YY > X,您都将获得true,因为X.a > Y.bY.a > X.b

即使X > XY > Y也会产生true,这绝对不能发生。

因此,您应该根据比较相同属性来定义比较规则。否则,您将打破反思性和传递性规则。

如果a < b怎么办?您可以更牢固,简洁地解决此问题:

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