干货:详解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中就 ...
随机推荐
- docker上运行mysql服务器
1.搜索MySQL镜像 $ docker search mysql INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED docker.io docker.i ...
- <题解>[IOI2019]景点划分
题目传送门(luogu) 题目传送门(loj) 这个题对我来说可以算是超出了我的能力范围 被学长拿来教我做构造,构造题真简单,构造题真是人,构造题真能手切... 首先对于本题,必须要知道dfs树这东西 ...
- 从 HTTP 切换到 HTTPS,这下我的技术博客安全了吧?
博客园 的小伙伴们,大家好,我是刚脱离险境的二哥呀! 很久(大概两年)之前,我就搞了一个独立的个人博客网站,长下面这样. 大家有访问过的,可以在评论区扣 1 可惜一直没搞备案和 HTTPS,导致每次访 ...
- 计算机网络模型和5G知识
目录 一.网络布线及信号传输 1.信号 2.传输介质 2.1双绞线 2.2光纤 2.3常见性问题 三.无线传播介质 四.综合布线系统 五.计算机的数制度以及运算 一.网络布线及信号传输 1.信号 频率 ...
- shell $? 状态码含义
Linux 使用了$? 来保存上个执行的命令的退出状态码. 0 命令成功结束 1 通用未知错误 2 误用she ...
- Xmind-xss漏洞复现并上线Coblat-strike
前言:本漏洞由WebRay烽火台实验室发现,Xmind2020存在xss漏洞,并且可以进行任意代码执行,目前官方还未进行补丁修复,所以请目前Xmind用户警惕Xmind文件. 本博客讲复现漏洞及上线到 ...
- HCNA Routing&Switching之DHCP服务
前文我们了解了STP的端口状态.计时器以及端口状态切换和网络拓扑变化相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15140672.html:今天我们 ...
- Docker部署ELK之部署kibana7.6.0(2)
1. 拉取kibana镜像 sudo docker pull kibana:7.6.0 2. 输入命令构建kibana容器,关于挂载kibana配置文件的问题,也可以先构建一个容器,然后把配置文件co ...
- HTML重点总结
HTML基础 1. 标题 HTML 标题(Heading)是通过<h1> - <h6> 标签来定义的. <h1>这是一个标题</h1> <h2&g ...
- CMD直接输入Java,Javac,Javap发生乱码解决方式
首先需要设置jdk的默认编码,在之前一篇博文里有 然后在cmd里直接执行chcp 65001 代表将cmd换成UTF-8的显示页 936是GBK 437为英语