繁体   English   中英

为什么 std::sort 在比较函数使用大于 (>) 而不是大于或等于 (>=) 时起作用?

[英]Why does std::sort work when the comparison function uses greater-than (>), but not greater-than-or-equal (>=)?

在 WIN32、Visual Studio 2022 上。当我定义一个包含一百个 0 的vector<int>并使用下面的代码对其进行排序时,会抛出异常“无效比较器”。

vector<int> v(100, 0);
sort(v.begin(), v.end(), [](const int& a, const int& b)
    {
        return a >= b;
    });

但是,如果我使用return a > b ,它会执行得很好。 这是为什么?

这正是它需要的工作方式 您需要严格的弱排序

对于基本原理,我认为充分的解释是这使您能够确定这些元素是否相等(例如对std::set有用)。 <=>=不能那样做

<=>=也可以做到这一点,但似乎只是决定使用<而不是任何其他关系。 考虑到这一决定,标准图书馆设施得以实施,他们严重依赖它

问题是您提供的比较器(又名比较函数)没有实现严格的弱排序,因此它违反了导致未定义行为std::sort的先决条件。

来自std::sort

comp - 比较函数对象(即满足 Compare 要求的对象),如果第一个参数小于(即排在第二个之前)则返回 true。

比较

应用于满足 Compare 类型的对象的函数调用操作的返回值,当上下文转换为 bool 时,如果调用的第一个参数出现在由该类型引起的严格弱排序关系中的第二个参数之前,则返回 true,否则返回 false除此以外。

这基本上意味着我们提供的比较器函数Compare不应该对以下两个表达式求值为trueCompare(x, y)Compare(y, x) ,其中xy是一些参数。 否则,比较器不服从严格的弱排序。

要解决此问题,您应该将>=替换为>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM