新闻中心

C++ sort函数自定义排序规则_C++ std::sort比较函数的写法

2025-12-03
浏览次数:
返回列表
答案:使用std::sort需提供满足严格弱序的比较函数,可采用普通函数、lambda表达式或函数对象形式,用于自定义排序规则。

c++ sort函数自定义排序规则_c++ std::sort比较函数的写法

在使用 C++ 的 std::sort 函数时,如果要对自定义类型或非默认顺序进行排序,需要提供比较函数。这个比较函数决定了元素之间的“小于”关系,从而控制排序结果。

基本语法与要求

std::sort 定义在 algorithm 头文件中,其常用形式为:

std::sort(begin, end, comp);

其中 comp 是可选的比较函数或函数对象。它必须满足“严格弱序”(Strict Weak Ordering),即对于任意两个元素 a 和 b:

  • 如果 comp(a, b) 返回 true,则 a 应排在 b 前面。
  • 不能同时有 comp(a, b)comp(b, a) 为 true。
  • 若 a 和 b 相等(互不小于对方),它们的相对顺序可能变化(不稳定排序除非特别保证)。

比较函数的三种写法

1. 普通函数

适用于简单场景,比如按整数大小逆序排列:

bool cmp(int a, int b) {
    return a > b; // 降序
}

std::vector vec = {3, 1, 4, 1, 5};
std::sort(vec.begin(), vec.end(), cmp);

也可以用于结构体:

struct Student {
    std::string name;
    int score;
};

bool cmpStudent(const Student& a, const Student& b) {
    return a.score }

2. Lambda 表达式(推荐)

GoEnhance GoEnhance

全能AI视频制作平台:通过GoEnhance AI让视频创作变得比以往任何时候都更简单。

GoEnhance 347 查看详情 GoEnhance

更灵活、可读性强,适合局部逻辑:

std::vector students = {/*...*/};

// 按分数降序,分数相同时按名字字典序升序
std::sort(students.begin(), students.end(), [](const Student& a, const Student& b) {
    if (a.score != b.score)
        return a.score > b.score;
    return a.name });

一行写法(简单情况):

std::sort(vec.begin(), vec.end(), [](int a, int b) { return a

3. 函数对象(仿函数)

适合复杂逻辑或需携带状态的情况:

struct CompareStudent {
    bool operator()(const Student& a, const Student& b) const {
        return a.score     }
};

std::sort(students.begin(), students.end(), CompareStudent{});

常见注意事项

  • 比较函数应返回 bool 类型,且不要修改传入参数(建议用 const 引用)。
  • 避免写成 return a ,这会破坏严格弱序(相等时不应返回 true)。
  • Lambda 中若捕获变量,注意是否影响性能或逻辑。
  • 结构体排序时,优先考虑复合条件下的分支处理。

基本上就这些。掌握这几种写法后,可以应对大多数排序需求。实际开发中推荐使用 lambda,简洁直观。

以上就是C++ sort函数自定义排序规则_C++ std::sort比较函数的写法的详细内容,更多请关注其它相关文章!


# 降序  # 赤峰公司网站建设招标  # ai对seo的影响  # 营销推广策略作用有  # 番禺区网站建设电话  # 东莞互联网网站建设便宜  # seo60 .com  # 六安网站怎么推广  # 山东苹果营销推广方案  # 鹤壁建设网站推广  # 苏州地产营销推广策划公司  # 推荐使用  # go  # 升序  # 复用  # 多路  # 管理机制  # 如何实现  # 何为  # 都是  # 自定义  # 排列  # c++ 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: J*a如何使用AtomicInteger控制计数_J*a无锁计数器性能分析  斑马英语APP如何开启夜间护眼阅读_斑马英语APP夜间模式与低蓝光设置教程  自定义Bag-of-Words实现:处理带负号的词汇权重  抖音网页版企业服务中心登录入口_抖音网页版企业登录平台  12306选座如何查看座位示意图_12306座位示意图解读与使用  PHP URL参数传递与500错误调试指南  抖音网页版快捷访问 抖音网页版网页版入口操作教程  Django模型中自动计算可用余额的实现方法  J*a里如何使用forEach遍历Map_Map遍历方法说明  VS Code远程开发时如何处理文件权限问题  J*a TimerTask中HashMap意外清空的深层原因与解决方案  Lar*el如何正确地在控制器和模型之间分配逻辑_Lar*el代码职责分离与架构建议  解决Django多数据库/多Schema环境下外键迁移问题  解决Rails应用中内容错位与Turbo警告:meta标签误用导致富文本渲染异常  Tabulator表格日期时间排序问题及自定义解决方案  优化 Python 函数中的条件逻辑:解决 if-else 嵌套与参数选择问题  魅族17怎样用浏览器译外语网页_iPhone魅族17浏览器译外语网页【即时翻译】  HTML元素状态管理:根据DIV内容动态启用/禁用按钮  高德地图公交到站提醒失败如何解决 高德提醒权限设置  神经网络二分类模型训练异常:高损失与完美验证准确率的排查与修正  邮政快递单号查询入口 邮政快递物流信息在线查询入口  在Go Martini框架中高效服务动态生成图像的实践指南  vivo云服务网页版登录 怎么登录vivo云服务网页版  《铁拳8》黑皮辣妹新实机:元气满满的18岁少女!  fishbowl官网免费版 fishbowl养鱼网站入口  TikTok国际版官网直达_TikTok国际版官网直达进入在线观看  微信语音通话掉线如何解决 微信语音通话稳定优化方法  在J*a中如何使用Stream.map转换元素_Stream映射操作解析  Spyder启动失败:字体文件权限拒绝错误解决方案  Golang如何实现简单的Web表单_Golang表单提交与验证处理方法  Composer如何在生产环境安全地执行composer update  Win10怎么设置静态IP地址 Win10手动配置IP地址步骤【指南】  在命令行怎么运行html项目_命令行运行html项目方法【教程】  JUnit5/Mockito:优雅测试内部依赖与异常处理的实践  Golang如何使用buffered channel提高性能_Golang buffered channel优化技巧  12306选座怎么选到临时改签座_12306改签选座策略与步骤  J*aScript中针对特定容器内图片动画的实现教程  红果短剧网页版官网入口 官方最新网址发布  J*a应用程序首次运行自动创建文件与目录的最佳实践  Odoo 16:在表单视图中基于当前记录动态修改Tree视图属性  LINUX下如何进行磁盘分区_fdisk与parted工具在LINUX中的使用对比  AO3同人作品网入口 AO3搜索引擎官网永久地址  从OpenAI API响应中高效提取生成文本  vivo手机互传视频怎么操作_vivo手机互传视频详细传输方法  QQ邮箱登录平台入口 QQ邮箱网页版邮箱官方入口  C++如何操作大型数据集_使用C++流式处理(Streaming)技术避免一次性加载大文件  Angular Material 垂直步进器:实现底部到顶部排序的教程  中兴Axon42Ultra怎样在文件App筛图_iPhone中兴Axon42Ultra文件App筛图【图片筛选】  Composer的 "check-platform-reqs" 命令有什么用_在部署前检查生产环境是否满足Composer依赖需求  极速漫画官方主页网址 极速漫画漫画在线浏览官网链接 

搜索