c++排序相关的参数“cmp“的用法及理解
对sort函数(需要algorithm头文件),它的cmp可以是“函数”,也可以是“对象”
bool myfunction (int i,int j) { return (i<j); }
struct myclass
{
bool operator() (int i,int j) { return (i<j);}
} myobject;
int main ()
{
int myints[] = {32,71,12,45,26,80,53,33};
vector<int> myvector (myints, myints+8);//放进容器vector
sort(myfunction); //参数cmp是个函数
sort(myobject);//参数cmp是个结构体对象
return 0;
}
▲注意:这里的函数myfunction返回类型为bool,返回真时认为i<j,假时认为i>=j,排序默认从小到大,因此反向排序只需把return (i<j)改成return (i>j)。
另外值得一提,结构体的bool operator() (int i,int j)函数,实际上是操作符的重载函数,对括号进行了重载,相当于平时用的operator +(…)这种,因此对于结构体对象myobject,可以这样操作bool re = myobject(1,2);,结果将会返回false,书写的形式跟函数一样(方便理解记忆,实际上参数并不能从“函数”类型转换成“对象”类型,是重载)
---------------------------------------------------------------------------------------------------------------------
对qsort函数,cmp是函数名
int values[] = { 40, 10, 100, 90, 20, 25 };
int cmp(const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}
int main ()
{
int n;
qsort (values, 6, sizeof(int), cmp);//qsort() 函数的声明:
//C 库函数 void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*)) 对数组进行排序。
//base -- 指向要排序的数组的第一个元素的指针。
//nitems -- 由 base 指向的数组中元素的个数。
//size -- 数组中每个元素的大小,以字节为单位。
//compar -- 用来比较两个元素的函数。
return 0;
}
▲注意:这里的函数cmp必须对上原型 int (__cdecl* _PtFuncCompare)(void const, void const),说白了就是返回值为 int,函数名字随意,函数参数类型要为 void const*(const顺序可调)。里面 (int)a 实际就是:先把 void* 型的指针a强制转成 int* 指针,在 * ((int*)a),把指向对象拿出来比较,如果是其他float/double,不用多说,改成 *(double *)之类的。
顺带一题,此处为升序排列,返回值小于0(一般写成返回-1),认为a比b小,等于0认为相等,大于0(一般写成返回1)认为a比b大,想要从大到小的降序排序,改下即可
| cmp( (void *) & a, (void *) & b ); | |
| cmp 函数的返回值 | 描述 |
| <0 | a将被排在b前面 |
| >0 | a将被排在b后面 |
| =0 | a=b |
-----------------------------------------------------------------------------------------------------------------------------------
对STL容器,如优先队列(最大/最小堆,默认为最大堆)priority_queue类来说,其模板参数只能类/结构体名,因此它的"cmp"要为结构体名(注意不是上面说的myobject了,是结构体的名字),里面需有操作符()重载函数。
struct cmp //名字自定
{
bool operator ()(int a, int b)
{
return a.val < b.val;
}
}
int main()
{
/*需要头文件queue,第一个模板参数为数据类型,第二个为容器类型,第三个为结构体*/
priority_queue<int, vector<int>, cmp> t;
return 0;
}
▲注意:这里的cmp返回值为bool型,函数为对括号的重载函数。
值得一提的是,这个花样还挺多的:
class A
{
int val;
bool operator <(int a, int b) const {return a<b;} //这里const不能省,参数你可写成const int &a等,加const说明函数是不能改变类中的成员变量的。
//如果想最小堆优先,则将return a<b;改为return a>b;后者根据题目需求自己定义。
//friend bool operator <(const int &a, const int &b) //友元函数也可以
}
int main()
{
priority_queue< A , vector<A> > t;
return 0;
}
如果类中重载了“ < ” (注意:重载 “>” 会编译错误,从数学上来讲只重载 < 就够了),就不用指定队列使用哪个cmp。若指定为最大堆可以第三参数( cmp 的位置)可写成 less,最小堆可以写成 greater,一步到位。
简单来说,STL 中模板参数需要填类名,要么类里重载 '< '、要么类外写个结构体重载 ‘()’ 后作模板参数填进去。
c++排序相关的参数“cmp“的用法及理解的更多相关文章
- (C++)STL排序函数sort和qsort的用法与区别
主要内容: 1.qsort的用法 2.sort的用法 3.qsort和sort的区别 qsort的用法: 原 型: void qsort(void *base, int nelem, int widt ...
- 《OOC》笔记(3)——C语言变长参数va_list的用法
<OOC>笔记(3)——C语言变长参数va_list的用法 C语言中赫赫有名的printf函数,能够接受的参数数目不固定,这就是变长参数.C#里也有params这个关键字用来实现变长参数. ...
- MySQL索引统计信息更新相关的参数
MySQL统计信息相关的参数: 1. innodb_stats_on_metadata(是否自动更新统计信息),MySQL 5.7中默认为关闭状态 仅在统计信息配置为非持久化的时候生效. 也就是说在i ...
- 认识loadrunner及相关性能参数
认识loadrunner及相关性能参数 LoadRunner,是一种预测系统行为和性能的负载测试工具.通过以模拟上千万用户实施并发负载及实时性能监测的方式来确认和查找问题,LoadRunner能够对整 ...
- Linux vm运行参数 - OOM相关的参数
一.前言 本文是描述Linux virtual memory运行参数的第二篇,主要是讲OOM相关的参数的.为了理解OOM参数,第二章简单的描述什么是OOM.如果这个名词对你毫无压力,你可以直接进入第三 ...
- 第3节 mapreduce高级:12、mapreduce相关的参数调整
5.1 多job串联 一个稍复杂点的处理逻辑往往需要多个mapreduce程序串联处理,多job的串联可以借助mapreduce框架的JobControl实现 示例代码: ControlledJob ...
- PHP 根据对象属性进行对象数组的排序(usort($your_data, "cmp");)(inside the class: usort($your_data, array($this, "cmp")))
PHP 根据对象属性进行对象数组的排序(usort($your_data, "cmp");)(inside the class: usort($your_data, array($ ...
- MYSQL DATE_FORMAT参数列表及用法
MYSQL DATE_FORMAT参数列表及用法 主要涉及用法 DATE_SUB(DATE, INTERVAL EXPR TYPE) DATE_FORMAT(DATE,FORMAT) REPLACE( ...
- Folx中与下载相关的参数如何设置
Folx是一款简单易用,功能强大的MacOS专用下载管理工具.要使Folx下载/上传速度快,同时又不影响其他软件的上网使用,还能够有计划地安排下载,那么就必须对Folx进行参数设置.接下来小编详细讲解 ...
随机推荐
- django学习-4.url动态传值
1.前言 我们在浏览器访问一个网页A是通过一个指定的url地址去访问的.但在浏览器用一个不存在的url地址去执行访问是打不开正确的网页的,只会打开一个浏览器自带的有错误提示的网页. 在django框架 ...
- Scrapy项目_阳光热线问政平台
目的: 爬取阳光热线问政平台问题中每个帖子的标题.详情URL.详情内容.图片以及发布时间 步骤: 1.创建爬虫项目 1 scrapy startproject yangguang 2 cd yangg ...
- 推荐一款好用的免费远程控制软件——ToDesk
创作立场声明:我在本文中评测的软件为自用,感觉不错并且全免费,第一时间发出来和大家分享,欢迎理性观点交流碰撞. 疫情刚开始的时候,待在家里不能上班,但是还是有很多工作需要在线完成,常常需要跑回办公室拿 ...
- 一文读懂网管协议 - SNMP,NETCONF,RESTCONF
本文篇幅较长,主要涉及以下内容: 介绍传统 CLI 配置网络设备存在的挑战,网管协议出现的背景 SNMP 原理,交互过程,以及 trade-off NETCONF 架构,交互过程 RESTCONF 架 ...
- 获取点击元素的id
1.onclick="dianji(this.id)" 传入id到方法里function dianji(id){ //这个就是id}2. $(document).click(fun ...
- 必知必会之 Java
必知必会之 Java 目录 不定期更新中-- 基础知识 数据计量单位 面向对象三大特性 基础数据类型 注释格式 访问修饰符 运算符 算数运算符 关系运算符 位运算符 逻辑运算符 赋值运算符 三目表达式 ...
- Django框架admin后台管理和用户端静态文件
目录 一.admin后台管理 1. 如何使用 2. 路由分发的本质 二.用户上传的静态文件的展示 1. media配置 2. 手动开设media接口 三.图片防盗链 一.admin后台管理 djang ...
- EFCodeFirst属性映射约定
EFCodeFirst属性映射约定 EFCodeFirst 属性映射约定 CodeFirst与数据表之间得映射方式又两种:Data Annotation和Fluent API 默认约定: 表名为类名的 ...
- PAT-1119(Pre- and Post-order Traversals)+前序和后序遍历确定二叉树+判断二叉树是否唯一
Pre- and Post-order Traversals PAT-1119 这题难度较大,主要需要考虑如何实现根据前序遍历和后序遍历来确定一颗二叉树 一篇好的文章: 题解 import java. ...
- 清华大学-成绩排序(排序+解决MLE问题)
成绩排序 成绩排序 这里需要注意的就是超内存的问题. 解决方法就是通过指针的方式,每次动态开n大小的内存,而不是一开始就分配. #include<bits/stdc++.h> using ...