干货:详解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>(当然万能头我也没意见)
最简单的就是用它完成int类型升序排序
#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
如果需要降序排序,程序如下
#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)
那么我们再看一个结构体的排序实例:输入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参数!的更多相关文章
- ggplot2作图详解:入门函数qplot
ggplot2作图详解:入门函数qplot ggplot2的功能不用我们做广告,因为它的作者Hadley Wickham就说ggplot2是一个强大的作图工具,它可以让你不受现有图形类型的限制,创 ...
- springboot项目--传入参数校验-----SpringBoot开发详解(五)--Controller接收参数以及参数校验----https://blog.csdn.net/qq_31001665/article/details/71075743
https://blog.csdn.net/qq_31001665/article/details/71075743 springboot项目--传入参数校验-----SpringBoot开发详解(五 ...
- ***PHP $_FILES函数详解 + PHP文件上传 move_uploaded_file() 参数的正确写法
PHP $_FILES函数详解 在PHP中上传一个文件建一个表单要比ASP中灵活得多.具体的看代码. 如: 复制代码代码如下: <form enctype="multipart/fo ...
- jQuery的deferred对象详解 jquery回调函数
http://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_deferred_object.html jQuery的 ...
- 实例-sprintf() 函数详解-输出格式转换函数
Part1:实例 $filterfile = basename(PHP_SELF, '.php'); if (isset($_GET['uselastfilter']) && isse ...
- php调用C代码的方法详解和zend_parse_parameters函数详解
php调用C代码的方法详解 在php程序中需要用到C代码,应该是下面两种情况: 1 已有C代码,在php程序中想直接用 2 由于php的性能问题,需要用C来实现部分功能 针对第一种情况,最合适的方 ...
- JS006. 详解自执行函数原理与数据类型的快速转换 (声明语句、表达式、运算符剖析)
今天的主角: Operator Description 一元正值符 " + "(MDN) 一元运算符, 如果操作数在之前不是number,试图将其转换为number. 圆括号运算符 ...
- 详解C/C++函数指针声明
要理解一个C程序,仅仅理解组成该程序的符号是不够的.程序员还必须理解这些符号是如何组合成声明.表达式.语句和程序的. 我们先来看看下面的一个语句: 1 ( *( void(*)())0)(); 这是当 ...
- C++ Virtual详解(注意函数被隐藏的问题)
Virtual是C++ OO机制中很重要的一个关键字.只要是学过C++的人都知道在类Base中加了Virtual关键字的函数就是虚拟函数(例如函数print),于是在Base的派生类Derived中就 ...
随机推荐
- Charles抓包工具永久破解+https抓包需要安装安全证书+防止请求乱码
1.charles4.5.6版本安装+永久破解 链接:https://pan.baidu.com/s/1Z49AE6TG2IXUY-7qoyGU4g 提取码:3i97 安装好charles之后,把下载 ...
- Skywalking-04:扩展Metric监控信息
扩展 Metric 监控信息 官方文档 Source and Scope extension for new metrics 案例:JVM Thread 增加 Metrics 修改 Thread 的定 ...
- 预训练语言模型的前世今生 - 从Word Embedding到BERT
预训练语言模型的前世今生 - 从Word Embedding到BERT 本篇文章共 24619 个词,一个字一个字手码的不容易,转载请标明出处:预训练语言模型的前世今生 - 从Word Embeddi ...
- shell $? 状态码含义
Linux 使用了$? 来保存上个执行的命令的退出状态码. 0 命令成功结束 1 通用未知错误 2 误用she ...
- 一个故事看懂HTTPS
我是一个浏览器,每到夜深人静的时候,主人就打开我开始学习. 为了不让别人看到浏览记录,主人选择了"无痕模式". 但网络中总是有很多坏人,他们通过抓包截获我和服务器的通信,主人干了什 ...
- 优化SQL 查询性能
为什么查询会很慢 如果把查询看作是一个任务,那么它由一系列子任务组成,每个子任务都会消耗一定的时间.要优化查询,实际上是要优化其子任务,要么消除其中一些子任务,要么减少子任务的执行次数,要么让子任务运 ...
- 7年老Android收到阿里offer,跟领导提离职被怼:为年薪百万不做兄弟?
在当今社会,钱就是衡量一个人价值的标准,如果你在一家公司,领导再怎么重用你,但是薪资待遇却很低,这样根本是很难留住人,毕竟工作就是为了赚钱,要是连工资都满足不了,谈其他根本就是扯淡. 最近在职业论坛看 ...
- 树莓派3B/3B+/4B 刷机装系统烧录镜像教程
树莓派3B/3B+/4B 刷机装系统烧录镜像教程 树莓派 背景故事 刚拿到树莓派的第一件事,应该就是要装系统了,那么应该怎么操作呢?下面就给大家介绍一下吧. 硬件准备 树莓派:3B/3B+/4B,本教 ...
- Linux统计文本中某个字符串出现的次数
常用的有如下两种方式: 1.VIM 用vim打开文件,然后输入: :%s/hello//gn 如下图: 图中的例子就是统计文本中"hello"字符串出现的次数 说明: %s/pat ...
- 流动的观察者模式 | Flutter 设计模式
观察者模式,又称发布订阅模式,是一种行为设计模式--你可以定义一种订阅机制,可在对象事件发生时通知多个 观察 该对象的其他对象. 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主 ...