[英]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
不应该对以下两个表达式求值为true
: Compare(x, y)
和Compare(y, x)
,其中x
和y
是一些参数。 否则,比较器不服从严格的弱排序。
要解决此问题,您应该将>=
替换为>
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.