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

标签 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,它会尽可能地保留元素的顺序。如果第一个参数为负而第二个为正(让我们将 0 定义为正),比较器函数可以调整为 true:

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

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

关于c++ - 下面的比较器函数在 C++ 中是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50597496/

相关文章:

c++ - C++:为什么我必须以这种方式将声明声明为double?

c++ - 错误 : no matching function for call to 'begin(int*&)' c++

C++11 - 区分右值指针

c# - 从 C++ 升级到 C#

c++ - 根据掩码合并位序列a和b

c++ - C++ 命名空间在 Windows 和 linux 中的行为是否不同?

c++ - 错误 : expected a declaration

c++ - 当 C++ 程序在 Windows 上终止时,终止 stub 调用的最后一个函数是什么?

c++ - 线程安全类的有序静态初始化

c++ - 以不同用户身份运行的两个 exe 如何使用 COM(组件对象模型)进行通信