C++ sort 排序(降序、升序)使用总结

2023-11-14

一、升序

    C++ sort 函数十分方便,可以对内置类型也可对自定义类型进行快速排序,内置类型的使用比较简单,下面主要讨论自定义类型的排序,一般有如下几种使用方法:

1.1 重载比较操作符

    比如,我们现有一批学生,要根据他们的成绩进行升序排序,成绩如果相等则根据名字升序排序,那么我们可以如下操作:

[cpp]  view plain  copy   在CODE上查看代码片 派生到我的代码片
  1. struct Student{  
  2.     string name;  
  3.     int grade;  
  4.   
  5.     Student(string name, int grade) : name(name), grade(grade){}  
  6.   
  7.     bool operator < (const Student& rhs) const{  
  8.         return grade < rhs.grade  
  9.         || (grade == rhs.grade && name < rhs.name);  
  10.     }  
  11.   
  12.     friend void operator << (ostream& output, const Student& s){  
  13.         output << s.name << " " << s.grade << endl;  
  14.     }  
  15. };  
[cpp]  view plain  copy   在CODE上查看代码片 派生到我的代码片
  1. int main()  
  2. {  
  3.     vector<Student> vec;  
  4.   
  5.     vec.emplace_back("Jack", 20);  
  6.     vec.emplace_back("John", 30);  
  7.     vec.emplace_back("Amy", 20);  
  8.     vec.emplace_back("Bill", 90);  
  9.   
  10.     cout << "Before:" << endl;  
  11.     for(auto& s : vec){  
  12.         cout << s;  
  13.     }  
  14.   
  15.     sort(begin(vec),end(vec));  
  16.   
  17.     cout << endl << "After:" << endl;  
  18.     for(auto& s : vec){  
  19.         cout << s;  
  20.     }  
  21.   
  22.     return 0;  
  23. }  
  24. 1.2 比较函数

        当然,我们也可以自己写比较函数,实现如下:

    [cpp]  view plain  copy   在CODE上查看代码片 派生到我的代码片
    1. bool cmp(const Student& lhs, const Student& rhs){  
    2.     return lhs.grade < rhs.grade  
    3.     || (lhs.grade == rhs.grade && lhs.name < rhs.name);  
    4. }  

        按如下方式调用:

    [cpp]  view plain  copy   在CODE上查看代码片 派生到我的代码片
    1. sort(begin(vec),end(vec), cmp);  

    1.3 函数对象

        另外一种方式,即构造一个函数对象,抑或叫 functor,其实就是实现了重载 operator() 的一个类,代码如下:

    [cpp]  view plain  copy   在CODE上查看代码片 派生到我的代码片
    1. struct Compare{  
    2.     bool operator()(const Student& lhs, const Student& rhs){  
    3.         return lhs.grade < rhs.grade  
    4.         || (lhs.grade == rhs.grade && lhs.name < rhs.name);  
    5.     }  
    6. };  

        按如下方式调用:

    [cpp]  view plain  copy   在CODE上查看代码片 派生到我的代码片
    1. sort(begin(vec),end(vec), Compare());  

    1.4 Lambda

        C++11有了 Lambda 之后,就不必再为某些小函数写具名函数了,如下使用即可:

    [cpp]  view plain  copy   在CODE上查看代码片 派生到我的代码片
    1. sort(begin(vec), end(vec), [](const Student& lhs, const Student& rhs) {  
    2.                 return lhs.grade < rhs.grade   
    3.                     || (lhs.grade == rhs.grade && lhs.name < rhs.name); });  

    二、降序

        降序排序的方法与升序类似,如果采用比较函数、Lambda 或者比较函数的方式,只需要改一改比较条件就OK了,但是,如果对于Student类,我们定义了 operator < 之后,不想为了降序排序再定义一个 operator > 怎么办?两种办法!

    2.1 reverse

        升序排序之后,用 reverse 反转即可。

    2.2 反向迭代

        直接按如下方式调用即可,不用再去重载 operator > 

    [cpp]  view plain  copy   在CODE上查看代码片 派生到我的代码片
    1. sort(vec.rbegin(), vec.rend());  

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

C++ sort 排序(降序、升序)使用总结 的相关文章

随机推荐

  • Linux命令·find参数详解

    find一些常用参数的一些常用实例和一些具体用法和注意事项 1 使用name选项 文件名选项是find命令最常用的选项 要么单独使用该选项 要么和其他选项一起使用 可以使用某种文件名模式来匹配文件 记住要用引号将文件名模式引起来 不管当前路
  • C++小游戏:五子棋(含代码)

    怎样用c 做出五子棋呢 其实很简单 不需要很多算法和函数 下面展示代码 注释都在下面了 include
  • 《java与模式》笔记(二) 开闭原则

    4 1 什么是开闭原则 开闭原则指的是一个软件实体应对对扩展开发 对修改关闭 Software entities should be open for extension but closed for modification 这个原则是说
  • 二、删去字符串中的元音(Biweekly4)

    题目描述 给你一个字符串 S 请你删去其中的所有元音字母 a e i o u 并返回这个新字符串 示例 1 输入 leetcodeisacommunityforcoders 输出 ltcdscmmntyfrcdrs 示例 2 输入 aeio
  • 基于VLC的Unity视频播放器(一)

    思路来自 http blog csdn net yechen2320374 article details 52226294 using System using System Text using System Runtime Inter
  • Java下载Excel模板文件的实现

    在项目中经常会用到文件下载的功能 比如下载excel模板 这里简单记录一下实现过程 1 将模板文件放到项目资源文件目录中 也可以自定义其他位置 只要通过路径能找到该文件就行 2 controller层写下载的接口 下载导入模板 GetMap
  • 好多的服务器密码信息怎么保存,怎么查看已保存的远程服务器密码吗

    怎么查看已保存的远程服务器密码吗 内容精选 换一换 云服务器网络异常 防火墙未放行本地远程桌面端口 云服务器CPU负载过高等问题均可能导致云服务器无法正常登录 本节操作介绍无法登录Windows弹性云服务器的排查思路 当您的云服务器无法远程
  • 回型矩阵的打印问题

    一 输入一个矩阵 按照从外向里以顺时针的顺序依次打印出每一个数字 示例 如果输入如下矩阵 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1 2 3 4 8 12 16 15 14 13 9 5
  • mybatis搭建

    maven如何搭建 SE项目 下载maven http maven apache org download cgi bin 解压maven压缩文件 创建一个本地仓库目录 E maven E tools maven apache maven
  • 将Revit模型转入unity中

    注意 先把Revit模型放到基点中心 方便后续unity中的旋转等操作 先将Revit模型导出到Navisworks中 然后在Navisworks中把NWC导出为FBX格式 导出时单位改为毫米 FBX格式可直接拖入unity中
  • 数学建模:灰色预测模型GM(1,1)matlab实现

    灰色预测的主要特点是模型使用的不是原始数据序列 而是生成的数据序列 其核 心体系是灰色模型 GreyModel GM 即对原始数据作累加生成 或其他方法生成 得到 近似的指数规律再进行建模的方法 优点是不需要很多的数据 一般只需要4个数据
  • Angular模型

    1 变量绑定 div 名字 div
  • The request client is not a secure context and the resource is in more-private address space `priva

    问题描述 Access to XMLHttpRequest at http 192 168 1 58 8182 sockjs node info t 1672991799369 from origin http 60 28 13 253 8
  • unity中AO、metallic、roughness贴图的使用方式

    albedo和normal贴图大家应该都知道 分别是纹理贴图和法线贴图 AO metallic roughness这3种贴图又该怎么给材质添加 AO metallic贴图比较简单 在standard的shader的Occlusion和Met
  • 使用 Docker 来运行 HuggingFace 海量模型

    本篇文章将分享如何通过 Docker 来在本地快速运行 Hugging Face 上的有趣模型 用比原项目更少的代码 和更短的时间成本将模型跑起来 如果你熟悉 Python 那么绝大多数的模型项目 都可以用 10 分钟左右的时间 完成本地的
  • 工业和信息化部关于印发贯彻落实《国务院关于积极推进“互联网+”行动的指导意见》行动计划(2015-2018年)的通知

    工业和信息化部关于印发贯彻落实 国务院关于积极推进 互联网 行动的指导意见 行动计划 2015 2018年 的通知 工信部信软 2015 440号 各省 自治区 直辖市工业和信息化主管部门 通信管理局 为贯彻落实党的十八届五中全会精神 促进
  • python:ezdxf——教程

    官方文档 https ezdxf readthedocs io en master tutorials index html 文章目录 一 从DXF文件获取数据的教程 1 布局 2 遍历布局的DXF实体 3 访问实体的DXF属性 4 得到一
  • Python_协程

    一些博客 https www liaoxuefeng com wiki 1016959663602400 1017968846697824 0 https www liujiangblog com course python 83 http
  • android开发Java调用C语言_Android使用jni调用c++/c方法详解

    1 下载ndk 2 编写jni的加载类 参考例子 public class JniTest public native String append String str1 String str2 static System loadLibr
  • C++ sort 排序(降序、升序)使用总结

    一 升序 C sort 函数十分方便 可以对内置类型也可对自定义类型进行快速排序 内置类型的使用比较简单 下面主要讨论自定义类型的排序 一般有如下几种使用方法 1 1 重载比较操作符 比如 我们现有一批学生 要根据他们的成绩进行升序排序 成