详解C++ sort函数的cmp参数

 更新时间:2021年09月08日 10:20:09   作者:异想之旅  
这篇文章主要介绍了C++ sort函数的cmp参数,以升降排序个结构体的排序展开的话题,感兴趣的小伙伴可以参考下面文章内容

前言:

学算法的第一天你在学冒泡、桶排

在你还没搞明白快排和归并的时候

你已经学到了数据结构最后的堆排序和希尔排序

可以说排序是很多竞赛生的噩梦……

于是它诞生了

void std::sort()

Sort the elements of a sequence using a predicate for comparison.

参数:
__first – An iterator.
__last – Another iterator.
__comp – A comparison functor.

针对一个地址区间完成排序,算法每次自动选择,以快排为主

C++需要头文件#include <algorithm> (当然万能头我也没意见)

1、升序排序

最简单的就是用它完成int类型升序排序

Copy Line-numbers language-cpp
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
    int a[5] = {2, 1, 3, 5, 4};
    sort(a, a + 5);
    for (int i = 0; i < 5; i++) cout << a[i] << " ";
}


输出如下,很简单

1 2 3 4 5

这里传入给sort的参数 a a + 5 都是地址,和大多数编程语言一样,这里遵循左闭右开原则,即函数实际会读取和操作的五个地址如下:

a + 0
a + 1
a + 2
a + 3
a + 4

2、降序排序

如果需要降序排序,程序如下

#include <iostream>
#include <algorithm>
using namespace std;

bool cmp(int x, int y){
    return x > y;
}

int main() {
    int a[5] = {2, 1, 3, 5, 4};
    sort(a, a + 5, cmp);
    for (int i = 0; i < 5; i++) cout << a[i] << " ";
}

输出:

5 4 3 2 1

我们多写了一个bool类型的cmp函数,并将其地址作为第3个参数传给了sort

cmp可以替换其内置的函数来判断究竟该让哪些元素在前哪些元素在后

很多小伙伴可能有个疑惑:如何从实质上理解cmp函数,或者说我究竟该怎么记住cmp怎么写呢?

我们来看这三个点:

  • 毋庸置疑,cmp函数返回bool类型,表示当前排序是否正确(具体见3)
  • cmp函数应接受两个参数,类型与要排序的数组相同(可以是int、short和long long这些常见类型,当然也可以是结构体)
  • cmp返回值的实际意义是传入a、b两个参数,a在前b在后的排序是否是正确的,若是正确的返回1(true),否则返回0(false)

那么我们再看一个结构体的排序实例

3、结构体的排序实例

结构体的排序实例:输入10个学生的名字和成绩,按照成绩从高到低排序后输出

输入数据:

Yixiangzhilv 90
Mydr 60
Xiaoming 10
Mr.Glass 60
GZN 80
Wangzi 85
Hyx 100
Wyx 99
Xth 0
Zz 75

程序实现如下:

#include <algorithm>
#include <iostream>
using namespace std;

struct node {
    string name;
    int score;
};

bool cmp(struct node x, struct node y) {
    return x.score > y.score;
}

int main() {
    struct node a[10];
    for (int i = 0; i < 10; i++) cin >> a[i].name >> a[i].score;
    sort(a, a + 10, cmp);
    for (int i = 0; i < 10; i++) cout << a[i].name << " " << a[i].score << endl;
}

(此处还有一个C++知识:如果已经定义结构体node,那么 struct node a[10]; 和 node a[10]; 都是合法的)

以上就是详解C++ sort函数的cmp参数的详细内容,更多关于C++ sort函数的cmp参数的资料请关注脚本之家其它相关文章,希望大家以后多多支持脚本之家

相关文章

  • QT线程池的使用(QThreadPool类和QRunnable类)

    QT线程池的使用(QThreadPool类和QRunnable类)

    本文主要介绍了QT线程池的使用(QThreadPool类和QRunnable类),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • C++实现车票管理系统

    C++实现车票管理系统

    这篇文章主要为大家详细介绍了C++实现车票管理系统,连接数据库MySQL,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • C语言实现系统关机注销功能

    C语言实现系统关机注销功能

    这篇文章主要为大家详细介绍了C语言实现系统关机注销功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • C++学习小结之二进制转换

    C++学习小结之二进制转换

    这篇文章主要介绍了C++学习小结之二进制转换的相关资料,需要的朋友可以参考下
    2015-07-07
  • 基于Linux系统调用--getrlimit()与setrlimit()函数的方法

    基于Linux系统调用--getrlimit()与setrlimit()函数的方法

    本篇文章是对在Linux系统中调用getrlimit()与setrlimit()函数的方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C语言双向链表的表示与实现实例详解

    C语言双向链表的表示与实现实例详解

    这篇文章主要介绍了C语言双向链表的表示与实现,对于研究数据结构域算法的朋友有一定的参考借鉴价值,需要的朋友可以参考下
    2014-07-07
  • C++中继承的概念和定义

    C++中继承的概念和定义

    这篇文章主要介绍了详解C++ 中的概念和定义,帮助大家更好的理解和学习使用c++,感兴趣的朋友可以了解下,希望能给你带来帮助
    2021-08-08
  • 深入理解C++中的new和delete并实现对象池

    深入理解C++中的new和delete并实现对象池

    这篇文章主要介绍了C++中的new和delete并实现对象池,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • C语言的数字游戏算法效率问题探讨实例

    C语言的数字游戏算法效率问题探讨实例

    这篇文章主要介绍了C语言的数字游戏算法效率问题探讨实例,需要的朋友可以参考下
    2014-04-04
  • Flutter应用Windows平台接入实践详解

    Flutter应用Windows平台接入实践详解

    这篇文章主要为大家介绍了Flutter应用Windows平台接入实践详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02

最新评论