下面的比较器函数如何在c ++中工作?

kra*_*ram 0 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;
}
Run Code Online (Sandbox Code Playgroud)

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

例:

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

sort(arr,arr+n, comp);

output : {-3,-1,1,2}
Run Code Online (Sandbox Code Playgroud)

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

Bat*_*eba 7

您的断言在两个方面是不正确的:

  1. std::sort不是保证保留不需要排序,如果你明白我的意思元素的顺序.

  2. comp函数的行为未定义,因为它return在所有控制路径上都没有显式值.

一种补救措施是使用std::stable_sort它将尽可能保持元素的顺序.可以调整比较器函数,使得true如果第一个参数为负且第二个参数为正(让我们将0定义为正):

bool comp(int a, int b){
    return a < 0 && b >= 0;
}
Run Code Online (Sandbox Code Playgroud)

另一种补救措施是使用std::stable_partition.