浅谈C/C++排序函数中cmp()比较函数的写法(qsort sort函数)

2023-05-16

转自 http://blog.csdn.net/lionel_d/article/details/41746135

首先,我们来谈谈大名鼎鼎的void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *));

它属于C语言标准库函数,应该是运用最多的了,今天我不是来教你们怎么用qsort的,只是来交流一下排序函数的最后一个参数cmp()(它不仅可以叫cmp,你还可以给他取名叫什么pig啊dog的只要是英文单词都可以,cmp只是人们对compare的一种常用缩写)比较函数的写法。

下面是cmp的写法:

[cpp]  view plain  copy
  1. int cmp(const void *a ,const void *b)  
  2. {  
  3.     return *(int *)a - *(int *)b ;          //从小到大排序,把a,b位置反过来就是从大到小   
  4. }  


注意:qsort的cmp()函数千万别写成下面这样

[cpp]  view plain  copy
  1. //错错错错错错错 错错错错错错错 错错错错错错错 错错错错错错错   
  2. int cmp(const void *a ,const void *b)  
  3. {  
  4.     return *(int *)a > *(int *)b ;       // > 与 < 都不行 !      
  5. }  
  6. //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX  


有一次就是写了下面的cmp(),结果排序死活不对!


下面是完整的测试代码:

[cpp]  view plain  copy
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3.   
  4. int cmp(const void *a ,const void *b)  
  5. {  
  6.     return *(int *)a - *(int *)b ;      //从小到大排序,把a,b位置反过来就是从大到小, 要加上*号
  7. }  
  8. int main()  
  9. {  
  10.     int a[10]={-1,9,5,7,-11,2,6,8,9,6};  
  11.     qsort(a,10,sizeof(int),cmp);  
  12.     for(int i = 0 ; i < 10 ; ++i)  
  13.     {  
  14.         printf("%d ",a[i]);  
  15.     }  
  16.     printf("\n") ;  
  17.     return 0 ;  
  18. }  

测试结果:






第二个cmp(),就是void sort( iterator start, iterator end, StrictWeakOrdering cmp );下面是标准声明:


  template <class RandomAccessIterator, class Compare>
  void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);  
他的头文件是<algorithm>,这个是标准C++头文件里的。

[cpp]  view plain  copy
  1. bool cmp(int a ,int b)  
  2. {  
  3.     return a < b ;       //从小到大排序,把 < 换成 > 就是从大到小   
  4. }  

好的,问题又来了,这个cmp与qsort的cmp不一样了,正好相反,他不能写成下面这样:

[cpp]  view plain  copy
  1. //错错错错错错错 错错错错错错错 错错错错错错错 错错错错错错错   
  2. bool cmp(int a ,int b)  
  3. {  
  4.     return a - b ;            
  5. }  
  6. //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX  


切记,切记!

下面是sort的测试代码:

[cpp]  view plain  copy
  1. #include <iostream>  
  2. #include <algorithm>  
  3.   
  4. using namespace std ;  
  5.   
  6. bool cmp(int a ,int b)  
  7. {  
  8.     return a < b ;           //从小到大排序,把 < 换成 > 就是从大到小   
  9. }  
  10.   
  11. int main()  
  12. {  
  13.     int a[10]={-1,9,5,7,-11,2,6,8,9,6};  
  14.     sort(a,a+10,cmp);  
  15.     for(int i = 0 ; i < 10 ; ++i)  
  16.     {  
  17.         cout<<a[i]<<" " ;   
  18.     }  
  19.     cout<<endl ;   
  20.     return 0 ;  
  21. }  

测试结果:




在C++中,我们经常需要用到set,map等容器,他们的cmp基本写法都与sort的相同,当然set,map的cmp可不仅仅是函数了,而是函数对象:

[cpp]  view plain  copy
  1. struct cmp{  
  2.     bool operator ()(const int a , const int b)  
  3.     {  
  4.         return a < b ;           // 从小到大,反过来就是从大到小   
  5.     }  
  6. };  

下面仅仅对set做代码测试:

[cpp]  view plain  copy
  1. #include <iostream>  
  2. #include <cstring>  
  3. #include <set>  
  4.   
  5. using namespace std ;  
  6.   
  7. struct Person{  
  8.     int age;  
  9.     char name[20];  
  10.     Person(int Age , const char Name[]):age(Age){strcpy(name,Name);}  
  11. };  
  12. struct cmp{  
  13.     bool operator ()(const Person a , const Person b)  
  14.     {  
  15.         return a.age < b.age ;           //  从小到大 ;   
  16.     }  
  17. };  
  18.   
  19. int main()  
  20. {  
  21.     set<Person,cmp> s ;  
  22.     Person n1(46,"ggg");  
  23.     Person n2(-16,"fff");           //年龄无负数,只是为了测试代码,下同   
  24.     Person n3(45,"eee");  
  25.     Person n4(-25,"ddd");  
  26.     Person n5(34,"ccc");  
  27.     Person n6(22,"bbb");  
  28.     Person n7(2,"aaa");  
  29.     s.insert(n1);  
  30.     s.insert(n2);  
  31.     s.insert(n3);  
  32.     s.insert(n4);  
  33.     s.insert(n5);  
  34.     s.insert(n6);  
  35.     s.insert(n7);  
  36.     set<Person,cmp>::iterator begin = s.begin();  
  37.     set<Person,cmp>::iterator end = s.end();  
  38.     for(set<Person,cmp>::iterator i = begin ; i != end ; ++i)  
  39.     {  
  40.         cout<<i->age<<" "<<i->name<<endl ;  
  41.     }  
  42.     return 0 ;  
  43. }  

测试结果:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

浅谈C/C++排序函数中cmp()比较函数的写法(qsort sort函数) 的相关文章

  • 浅谈C/C++排序函数中cmp()比较函数的写法(qsort sort函数)

    转自 http blog csdn net lionel d article details 41746135 首先 xff0c 我们来谈谈大名鼎鼎的void qsort void base int nelem int width int
  • C++中cmp()用法

    首先 xff0c 我们来谈谈大名鼎鼎的void qsort void base int nelem int width int fcmp const void const void 它属于C语言标准库函数 xff0c 应该是运用最多的了 x
  • STL std::sort 源码分析

    转载自http feihu me blog 2014 sgi std sort 最近在看sort源码 xff0c 看到这篇博文很好 xff0c 转发作为记录 xff0c 转载侵权联系我删除 背景 在校期间 xff0c 为了掌握这些排序算法
  • 关于C++中vector和set使用sort方法进行排序

    C 43 43 中vector和set都是非常方便的容器 xff0c sort方法是algorithm头文件里的一个标准函数 xff0c 能进行高效的排序 xff0c 默认是按元素从小到大排序 将sort方法用到vector和set中能实现
  • PyTorch:torch.sort()

    作用 xff1a 对给定tensor的指定维度进行排序 xff0c 返回排序后的结果和排序后的值对应原来维度位置的序号 举例说明 xff1a import torch a 61 torch randint 2 10 6 4 创建shape为
  • python中sort和sorted的高级排序技巧

    Python list内置sort 方法用来排序 xff0c 也可以用python内置的全局sorted 方法来对可迭代的序列排序生成新的序列 1 排序基础 简单的升序排序是非常容易的 只需要调用sorted 方法 它返回一个新的list
  • C++排序之stable_sort()的方法

    stable sort 可以对vector的某个成员进行排序 xff0c 而且可保证相等元素的原本相对次序在排序后保持不变 下面是该函数的实现方法代码 xff1a include lt iostream gt include lt math
  • Darknet-Deep_sort_pytorch 无人机跟踪识别记录

    创建数据集 使用labelme 构造voc数据集格式 转换txt为xml 开始训练 span class token function sudo span span class token function nohup span darkn
  • qsort的compare函数

    qsort的compare函数 功能 xff1a 使用快速排序例程进行排序 头文件 xff1a stdlib h 用法 xff1a void qsort void base size t num size t width int cdecl
  • 深入理解Arrays.sort()

    翻译人员 铁锚 翻译日期 2013年11月16日 原文链接 Deep Understanding of Arrays sort T Comparator lt super T gt c Arrays sort T Comparator lt
  • 汇编cmp比较指令详解

    刚刚看到了cmp指令 xff0c 一开始有点晕 后来上网找了些资料 xff0c 终于看明白了 xff0c 为了方便初学者 xff0c 我就简单写下我的思路吧 高手绕过 xff0c 谢谢 xff01 cmp compare 指令进行比较两个操
  • quick sort(c++)以及k选取

    include lt iostream gt include lt vector gt using rank 61 int using namespace std int dash 61 0 int swap vector lt int g
  • Linux shell 从文件中随机选择内容

    如果需要从文件中随机选择一定行的内容 可以借助sort 命令 如下 使用sort 命令将文件随机排序 选择前100行 sort random sort file head n 100
  • leetcode-03. 数组中重复的数字刷题笔记(c++)

    写在前面 难度 简单 unordered map 或 sort排序 大数组方法异常溢出 数据量 小数据量 数组元素作为下标 大数据量 无需map映射 耗费空间 sort排序 前后元素是否等值 题目详情 找出数组中重复的数字 在一个长度为 n
  • 简单分析 C 语言的 qsort() 源码

    简单分析 C 语言的 qsort 源码 stdlib h 是使用 C 语言需要引入的库 在系统文件下可以搜索到这个文件夹 在里面可以看到有一个 qsort 文件用编译器或者记事本打开就能看到里面的源码了 单从文件名看 qsort 采用的是快
  • js 对数组对象进行排序

    let listData id 1 name 测试1 presenttime 1557883600000 id 2 name 测试2 presenttime 1580751813000 id 3 presenttime 1561448381
  • stdlib的qsort是递归的吗?

    我读过qsort只是一种通用排序 不承诺实施 我不知道库在不同平台上有何不同 但假设 Mac OS X 和 Linux 实现大致相似 are the qsort递归实现和 或需要大量堆栈 我有一个大数组 数十万个元素 我想对它进行排序 而不
  • 如何为二维数组的 qsort 编写比较器函数?

    我有一个 n 2 大小的数组 我想根据第二列的值使用 qsort 对它们进行排序 include
  • c 中 qsort() 函数中的 cmpfunc

    有人可以解释一下吗cmpfunc这是用在qsort功能 什么是a and b在这个函数中 它们指向什么 int cmpfunc const void a const void b return int a int b a and b in
  • 稳定标准库 qsort?

    我假设 stdlib 中的旧 qsort 函数不稳定 因为手册页没有提及任何相关内容 这就是我正在谈论的功能 include

随机推荐

  • Microsoft 365 Copilot怎么安装,如何下载?

    Microsoft 365 Copilot是一款基于人工智能的数字助手 xff0c 旨在帮助Microsoft 365商业版的用户更轻松地管理其工作流程 它可以提供实时反馈 自动生成报告 优化时间表以及自动化办公任务等功能 xff0c 这些
  • 关于Sublime Text4 _4126

    目录 前言 一 下载安装 下载安装 二 汉化 Install PackageChineseLocalzations 三 激活 进入hexed网站编辑编辑改码另存为 四 运行 successfully 总结 前言 怕以后忘了 xff0c 上操
  • CSDN编写技巧--CSDN中高亮显示代码

    介绍一种好的格式如下 xff1a 实现的方法就是以原代码的形式显示页面 xff0c 然后复制以下代码 xff1a lt div style 61 34 BORDER BOTTOM cccccc 1px dashed BORDER LEFT
  • 去掉jOSN中的转义符

    json返回全都是带 39 39 的 于是要去掉这个反斜杠 但是OC里面的 39 39 是转义符 不能直接用 64 34 34 之类的表示 一顿搜索之后 找到了OC对转义字符的表示方法 如下 a Sound alert b 退格 f For
  • 微软 Win11 一个命令安装 Windows Linux 子系统(WSL)

    在最新的 Windows 11操作系统中 xff0c 你只需运行 wsl exe install 就可以安装运行 WSL 所需的一切 使用 wsl install 微软表示 xff0c 以前设置 WSL 的过程过于复杂 xff0c 涉及到开
  • linux服务器xrdp远程链接密码对了却password failed解决方法

    linux服务器xrdp远程链接密码对了却password failed解决方法 遇到问题问题定位解决参考链接 遇到问题 在win10下用自带的远程连接登陆服务器 xff0c 明明密码对了 xff0c 却无法登陆 xff0c 显示 pass
  • 滤波算法(四)—— 卡尔曼滤波算法

    一 算法介绍 卡尔曼滤波是一个神奇的滤波算法 xff0c 应用非常广泛 xff0c 它是一种结合先验经验 测量更新的状态估计算法 1 状态估计 首先 xff0c 对于一个我们关心的物理量 xff0c 我们假设它符合下面的规律 其中 xff0
  • selenium-Firefox浏览器驱动geckodriver的下载配置

    首先下载Firefox的驱动 xff0c 地址 xff1a geckodriver Mirror 选择最新的版本 xff0c 进入后选择对应的系统下载 xff1a 将下载下来的文件放入到自己python的安装目录中的Scripts文件夹中即
  • 行人检测之HOG——方向梯度直方图(Histogram of Oriented Gradient)

    写在前面的话 HOG 绝对说的是行人检测领域的一个标志性的里程碑 xff0c 虽然 2008 年出现的 DPM DeformablePart Model 方法取得了更好的检测效果 xff0c 但是实时性实在堪忧 xff0c 就算用多线程实现
  • Feedback Network for Image Super-Resolution(SRFBN)---翻译

    attention xff1a 只详细翻译了重点部分 摘要 图像超分辨率 xff08 SR xff09 的最新进展展现了深度学习的力量 xff0c 可以实现更好的重建性能 然而 xff0c 现有的基于深度学习的图像SR方法尚未充分利用人类视
  • UIControlEvents的几种类型值

    在实现响应事件的方法时 xff0c 需要传递响应类型 比如为button添加selector方法 首先 xff0c UIControlEvents有这个几种 xff1a UIControlEventTouchDown 61 1 lt lt
  • 【Rust】Iced GUI库初使用及踩坑——写一个计数器

    该文写于去年8月份 xff0c 目前iced更新到0 7已有些许API改动 xff0c 本文内容已有部分错误 xff0c 但仍有借鉴价值 写在前面 从5月份起 xff0c 我一直在寻找一个可用的 xff0c 稳定的 xff0c 开发者友好的
  • 低成本二进制部署K8S1.26版本集群

    本文以华为云为例 xff0c 低成本二进制方式测试部署K8S集群 xff08 V1 26 1 xff09 温馨提示 xff1a 首次使用公有云一定要注意新用户优惠 xff0c 最好用于购买云服务器 xff0c 长期持有的服务器资源可支持域名
  • kolla-ansible部署Train版openstack(all-in-one)

    本文最后更新于 207 天前 xff0c 其中的信息可能已经有所发展或是发生改变 kolla ansible简介 kolla 的使命是为 openstack 云平台提供生产级别的 开箱即用的交付能力 kolla 的基本思想是一切皆容器 xf
  • Ubuntu20.04云服务器安装配置Jupyter Lab

    前言 Jupyter Lab 是 Jupyter 主打的最新数据科学生产工具 xff0c 是基于Web的交互式开发环境 某种意义上 xff0c 它的出现是为了取代 Jupyter Notebook xff0c 但它也包含了 Jupyter
  • 51单片机(二十七)—— 蜂鸣器播放音乐

    1 实验原理介绍 蜂鸣器是电路中经常使用的发声器件 xff0c 我们一般使用蜂鸣器发出 嘀嘀 的声音 xff0c 用它作为提示音 有没有想过用蜂鸣器还可以播放音乐呢 xff1f 这显然是件很有意思的事情 本文使用蜂鸣器来播放音乐 为了深入了
  • win10安装visual studio C++ build tools 提示安装包丢失或毁坏

    坑爹的经历 xff0c 在玩一个django的项目时 xff0c 需要安装compressor的安装包 xff0c 使用pip install django compressor安装时 xff0c 提示 Microsoft Visual C
  • Ubuntu18.04 安装 Anaconda3

    1 下载 Anaconda 下载 Anaconda3 5 2 0 Linux x86 64 sh Ubuntu18 04的对应的Anaconda版本 xff1a 法1 xff1a 在Anaconda官网下载 xff0c 比较费时 xff0c
  • LWIP+FreeRTOS双网卡调试笔记

    软件版本 FreeRTOS10 lwip1 4 1 nbsp 平台 Ti TM4C1294 开发环境 CCS 6 问题 网卡1能够ping通 网卡2无法ping通 解决办法 通过打开LWIP DEBUG选项 然后打开IP DEBUG选项跟踪
  • 浅谈C/C++排序函数中cmp()比较函数的写法(qsort sort函数)

    转自 http blog csdn net lionel d article details 41746135 首先 xff0c 我们来谈谈大名鼎鼎的void qsort void base int nelem int width int