关于C++内置排序函数sort的自定义比较器cmp用法
发布日期:2021-05-28 16:52:35 浏览次数:32 分类:精选文章

本文共 2552 字,大约阅读时间需要 8 分钟。

关于C++内置排序函数sort的自定义比较器cmp用法

1.基础知识

C++的内置排序函数 sort 是一个非常方便且常用的工具,默认进行升序排序。其头文件为 <algorithm>。以下是一个简单的排序示例:

#include 
#include
using namespace std;int main() { vector
array = {1, 2, 12, 56, 47, 23, 88, 45, 3, 4, 5, 6, 7}; sort(array.begin(), array.end()); for(int num : array) { cout << num << " "; cout << endl; } return 0;}

运行结果如下:

1 2 3 4 5 6 7 12 23 45 47 56 88

如果对 int 数组 a[10] 进行排序,可以写成:

sort(a, a + 10);

2.关于自定义比较器 cmp

sort 函数可以使用自定义比较器来定制排序规则。以下是一个简单的比较器示例:

bool cmp_up(int a, int b) {    return a < b;}bool cmp_down(int a, int b) {    return a > b;}int main() {    vector
array = {1, 2, 12, 56, 47, 23, 88, 45, 3, 4, 5, 6, 7}; cout << "asc order: "; sort(array.begin(), array.end(), cmp_up); for(int num : array) { cout << num << " "; cout << endl; } cout << "desc order: "; sort(array.begin(), array.end(), cmp_down); for(int num : array) { cout << num << " "; cout << endl; } return 0;}

运行结果如下:

asc order: 1 2 3 4 5 6 7 12 23 45 47 56 88desc order: 88 56 47 45 23 12 7 6 5 4 3 2 1

3.自定义比较器的规则

自定义比较器 cmp 需要遵循以下规则:

  • 返回 true:第一个参数放在前面,第二个参数放在后面;返回 false 时则反之。
  • a 等于 b,必须返回 false
  • 以下是一个例子,用于将数组的奇数部分放在前面,偶数部分放在后面,并且保持奇数和奇数、偶数和偶数的相对位置不变:

    bool cmp(int a, int b) {    if ((a % 2 == 0 && b % 2 == 1)) {        return false;    } else if ((a % 2 == 0 && b % 2 == 0)) {        return false;    } else if ((a % 2 == 1 && b % 2 == 1)) {        return false;    } else {        return true;    }}int main() {    vector
    array = {1, 2, 12, 56, 47, 23, 88, 45, 3, 4, 5, 6, 7}; sort(array.begin(), array.end(), cmp); for(int num : array) { cout << num << " "; cout << endl; } return 0;}

    运行结果如下:

    1 47 23 45 3 5 7 2 12 56 88 4 6

    4. 增加排序规则

    在上述基础上,增加一个要求:相同类型的数之间按升序排序。

    bool cmp(int a, int b) {    if ((a % 2 == 0 && b % 2 == 1)) {        return false;    } else if ((a % 2 == 0 && b % 2 == 0)) {        return a >= b ? false : true;    } else if ((a % 2 == 1 && b % 2 == 1)) {        return a >= b ? false : true;    } else {        return true;    }}

    运行结果如下:

    1 3 5 7 23 45 47 2 4 6 12 56 88

    5. 个人想法

    记住自定义比较器的规则非常重要。比较器的正确性直接决定了排序结果的准确性。您可以参考以下Bilibili视频来进一步理解:https://search.bilibili.com/all?keyword=sort%20cmp%20C%2B%2B

    总结规则:

    • 返回 true 时,第一个参数放在前面,第二个参数放在后面。
    • 返回 false 时,反之。
    • a 等于 b 时,必须返回 false

    自定义比较器不能作为类成员函数定义在类中,这一点需要注意。此外,编写自定义比较器时,一定要仔细,避免遗漏任何情况,否则会导致排序出错。

    补充说明:相等时返回 false 的原因是,sort 函数默认使用 std::less 条件类型比较。使用默认比较可以避免相等元素的排序问题,而自定义比较器则可以根据需求进行调整。

    上一篇:【头条笔试T2】
    下一篇:整数取反(取负)运算

    发表评论

    最新留言

    表示我来过!
    [***.240.166.169]2025年04月20日 15时18分48秒