在 C++ STL 的比较函数中使用"<="符号而不是"<"符号有什么区别?

What is the difference between using a "<=" sign instead of a "<" sign in the compare function of an STL in C++?

本文关键字:lt 符号 什么 区别 C++ 比较 STL 函数      更新时间:2023-10-16

我必须在sort()函数中实现第三个参数cmp,以降序对整数数组进行排序。

问题是这个定义不能正常工作,

bool cmp (int a, int b)
{
    if(a<b)
        return false;
    else
        return true;
}

但是,这确实

bool cmp (int a, int b)
{
    if(a<=b)
        return false;
    else
        return true;
}

在main()函数中,我使用

sort(Arr,Arr+n,cmp);

请注意,我声称第一个代码无法正常工作,因为我在 Codechef 上解决问题的解决方案在我使用第二个代码时被接受,但不适用于第一个代码。

如果两个值相等,则 STL 比较函数必须返回 false。

在排序中,

最后一个参数:

comp - 比较函数对象(即满足比较要求的对象) ....

比较

比较(a, b)

建立具有以下属性的严格弱排序关系:

对于所有 a,comp(a,a)==false

....

这就是为什么

if(a<=b) 
    return false;

工作,而

if(a<b)
    return false;

不。

std::sort 的比较函数返回一个值,该值指示作为第一个参数传递的元素是否被视为在其定义的特定严格弱排序中先于第二个参数。

这是来自 sgi 的严格弱排序的定义

严格弱排序是比较两个的二进制谓词对象,如果第一个在第二个之前返回 true。这谓词必须满足严格的弱排序。确切的要求如下所述,但是什么他们大致的意思是严格弱排序必须按照方式行事"小于"的行为是:

    如果 A 小于 B,
  • 则 B 不小于 A,
  • 如果 A 小于 B
  • 且 B 小于 C,则 A 小于 C,等等。

根据比较函数的文档:

建立严格的弱排序关系

因此,函数comp必须定义严格的弱排序。根据定义,它必须满足三个条件:

1) 对于所有x comp(x, x)为假(自反性条件)

2) 如果comp(x, y)!comp(x, y)(不对称条件)

3) 如果comp(x, y)comp(y, z)comp(x, z)(传递条件)

很容易看出,cmp函数的第一个示例不满足自反性条件,因此不能用作std::sort的参数传递comp。同样清楚的是,在x, y are 数字的情况下,第二个cmp示例满足所有三个条件,因此它可以作为comp参数传递给 std::sort。

提供给 std::sort 的比较函数必须返回 true,如果它的第一个参数位于所需的排序中的第二个参数之前,否则返回 false。

因此,对于降序排序,您应该使用 > 运算符>,对于 int s,它返回<=运算符返回的补码(您用于实现比较)。最好使用std::greater<int>来避免此类陷阱。