按两个条件对lambda表达C 进行排序
Sort Lambda Expression C++ by two condition
我正在尝试对列表中的数据进行排序。我需要那种
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 > Y
或Y > X
,您都将获得true
,因为X.a > Y.b
和Y.a > X.b
。
即使X > X
和Y > 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();
});
相关文章:
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 可组合的lambda/std::函数与std::可选
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 如何建立使用模板函数的lambda函数的尾部返回类型
- '||'之前的预期主要表达
- 如何将lambda作为模板类的成员函数参数
- C++从其他 constexpr 创建 lambda 不能按顺序执行 Constexpr
- 在 lambda 捕获中声明的变量的类型推导
- 我可以将调用类的"this"传递给 lambda 函数吗?
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- Clang 8的Lambda表达中的双重崩溃
- lambda表达式在while()中调用,为什么我们需要在lambda表达后添加()
- lambda表达中的凸面
- C lambda表达含义
- 是否有原子lambda表达
- 按两个条件对lambda表达C 进行排序
- 分支中的lambda不持续表达:谁是对的
- 通用的lambda及其作为恒定表达的论点
- 触发快捷方式(QT)时的lambda表达
- 在 boost::lambda 中表达 _1.second->pair().first == r