繁体   English   中英

下面的比较器功能如何在c ++中工作?

[英]How does below comparator function works in c++?

bool comp(int a,int b){

    if ((a > 0 && b > 0) || (a < 0 && b < 0))
        return false;

    if ((a > 0) && (b < 0))
        return false;
}

对于给定的包含正整数和负整数的数组,上述函数可用于重新排列数组,以使负整数后跟正整数,并保留元素的顺序。

例:

int arr [] = {1,2,-3,-1}, n=sizeof(arr)/sizeof(int);

sort(arr,arr+n, comp);

output : {-3,-1,1,2}

但是我无法理解它是如何工作的,有人可以解释吗?

您的断言有两个方面是错误的:

  1. 如果您了解我的意思,则不能保证std::sort保留不需要排序的元素的顺序。

  2. 您的comp函数的行为是不确定的,因为它在所有控制路径上都没有明确的return值。

一种补救方法是使用std::stable_sort ,它将尽最大可能保留元素的顺序。 比较器功能可以被调节,使得它的true如果第一个参数是负的,第二个是阳性(让我们定义0为正):

bool comp(int a, int b){
    return a < 0 && b >= 0;
}

另一种解决方法是使用std::stable_partition

但是我无法理解它是如何工作的,有人可以解释吗?

我试图解释它应该如何工作,但实际上,它不起作用:)

bool comp(int a, int b) {

    if((a > 0 && b > 0) || (a < 0 && b < 0))
        return false;

    if((a > 0) && (b < 0))
        return false;

    return true;
}

此代码试图比较符号:检查a符号是否比b符号“小”。 假设负数小于正数。 因此,-1的符号小于1的符号,-3的符号不小于-1的符号。

这里的问题是比较器应始终符合https://en.wikipedia.org/wiki/Weak_ordering#Strict_weak_orderings的要求

简而言之,严格的弱排序是:对于任何ab ,只有一个条件成立: a < bb < ab == a 一个条件中有多个为真时,就不应存在。

当生产代码中违反严格的弱订购时,将发生非常糟糕的事情:加班,截止日期失败,甚至更糟。

您的sort()在以下数组上将失败: { 1, 0, 2, 0, -3, 0,-1 }因为违反了严格的弱排序: comp(-1, 0)为true并且comp(0, -1)是真的。

暂无
暂无

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

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