我正在尝试对列表中的数据进行排序。 我需要那种
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();
});
答案 0 :(得分:2)
您不能使用这样的比较函数进行排序,因为它定义的排序规则内部不一致。为了排序,X < Y
必须暗示Y < X
是错误的。
考虑这两个对象:
Name a b
---- - -
X 2 1
Y 2 1
无论您如何比较它们X > Y
或Y > X
,都会得到true
,因为X.a > Y.b
和Y.a > X.b
。
即使X > X
和Y > 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();
});