新闻中心

c++ 怎么自定义排序算法_c++排序函数与自定义比较规则讲解

2025-11-09
浏览次数:
返回列表
std::sort结合自定义比较规则可灵活排序任意类型数据。1. 基本用法:std::sort(起始, 结束)默认升序。2. 自定义函数:传入比较函数实现降序或复杂逻辑。3. 结构体排序:按成绩高低再按名字字典序排列学生信息。4. Lambda表达式:C++11后可用匿名函数简化代码。5. 注意事项:满足严格弱序,使用const引用避免拷贝,静态函数需static声明,Lambda避免不必要的捕获。熟练掌握可提升效率与可读性。

c++ 怎么自定义排序算法_c++排序函数与自定义比较规则讲解

C++ 中的排序操作非常灵活,尤其是在使用 std::sort 函数时,可以结合自定义比较规则对任意类型的数据进行排序。掌握这一点,能让你在处理复杂数据结构(如结构体、类对象)时游刃有余。

1. std::sort 基本用法

std::sort 是 C++ 标准库中定义在 <algorithm></algorithm> 头文件里的函数,用于对容器或数组中的元素进行排序。基本语法如下:

#include <algorithm>
std::sort(起始迭代器, 结束迭代器);

默认情况下,它按升序排列元素(使用 比较)。例如对数组排序:

#include <iostream>
#include <algorithm>
int arr[] = {5, 2, 8, 1};
std::sort(arr, arr + 4); // 升序

2. 自定义比较函数(函数指针或函数对象)

当需要按特定规则排序时,可以传入第三个参数:一个**比较函数**或**函数对象**。这个函数必须返回布尔值,表示第一个参数是否应该排在第二个参数之前。

例如,实现降序排序:

bool cmp(int a, int b) {
    return a > b;  // a 排在 b 前面当且仅当 a > b
}
std::sort(arr, arr + 4, cmp);

3. 对结构体或类对象排序

实际开发中常需对结构体排序。比如有一个学生结构体,按成绩从高到低排序,成绩相同时按名字字典序:

易标AI 易标AI

告别低效手工,迎接AI标书新时代!3分钟智能生成,行业唯一具备查重功能,自动避雷废标项

易标AI 135 查看详情 易标AI
struct Student {
    std::string name;
    int score;
};

编写比较函数:

bool cmp(const Student& a, const Student& b) {
    if (a.score != b.score) {
        return a.score > b.score;  // 成绩高的在前
    }
    return a.name < b.name;        // 成绩相同则名字字典序小的在前
}

使用方式:

std::vector<Student> students = {{"Alice", 85}, {"Bob", 90}, {"Charlie", 85}};
std::sort(students.begin(), students.end(), cmp);

4. 使用 Lambda 表达式(C++11 及以上)

Lambda 让自定义排序更简洁,尤其适合临时逻辑。上面的例子可改写为:

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 < b.name;
});

优点是代码紧凑,逻辑清晰,无需额外定义函数。

5. 注意事项与常见错误

  • 比较函数必须满足严格弱序(Strict Weak Ordering),即不能出现循环依赖(如 a
  • 传递给 sort 的比较函数应尽量声明为 const 引用,避免拷贝开销。
  • 若在类中定义静态比较函数,需声明为 static 才能作为 sort 的参数。
  • Lambda 若捕获外部变量,要确认是否必要,否则建议用 [] 空捕获列表。

基本上就这些。熟练使用 std::sort 配合自定义比较规则,能大幅提升编码效率和程序可读性。

以上就是c++++ 怎么自定义排序算法_c++排序函数与自定义比较规则讲解的详细内容,更多请关注其它相关文章!


# 在前  # 高密律师网站推广公司  # 安徽推广计划网站官网  # 营销推广协议模板图片  # 珠宝网站怎样推广好卖点  # 免税店营销推广的工作  # 抖音seo后缀词  # 个人网站建设定制开发  # 网站推广团队分工图  # 棋牌网站SEO  # 营销网站建设推广公司  # 迭代  # 库中  # 有什么区别  # c++  # 排在  # 进阶  # 数据结构  # 如何使用  # 升序  # 自定义  # 标准库  # 排列  # stream  # ios  # 编码  # go  # 排序算法 


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


相关推荐: Bilibili动漫最新防封地址发布-Bilibili动漫2025年最稳正版入口推荐  MAC如何将整个网页截长图_MAC使用Safari的导出为PDF或第三方工具  处理嵌套交互式控件:前端可访问性指南  新三国志曹操传110级星符试炼夏侯渊极难攻略  PS5 Pro有点优势但不多! 《燕云十六声》PS5平台与PC性能画面对比  Golang指针如何与map组合使用_Golang map指针组合实践  c++如何使用chrono库处理时间_c++标准库时间与日期操作  Win10双系统截图高效法 截屏快捷键速记【技巧】  构建轻量级网站内部消息系统:Formspree 集成指南  深入理解Go语言中Map值与方法接收器的交互:为什么需要临时变量  极兔快递快件信息查询系统 极兔快递官网运单号追踪  QQ邮箱官方网站登录入口_QQ邮箱网页版在线使用  必由学官网快捷入口 必由学网页版在线学习平台  c++ dfs和bfs代码 c++深度广度优先搜索算法  必由学官方网站入口 必由学学生教师共用登录通道  Tabulator表格日期时间排序问题及自定义解决方案  韩剧圈正版入口页面_韩剧圈官网登录链接  J*aScript Promise链中如何正确终止后续.then执行并处理错误  Composer的 "licenses" 命令如何帮助你遵守开源协议_检查项目依赖的许可证合规性  2026春节假期时间安排 2026春节假日查询  如何在Python中使用Optional类型处理可变对象并避免Pylint警告  快手极速版在线观看 官方网页版登录地址  三星ZFold5多任务卡顿_Samsung ZFold5流畅度提升  必由学官网首页入口 必由学教师网页版登录指南  知乎APP怎么管理已购盐选内容_知乎APP盐选内容购买记录与查看方法  必由学官方登录入口 必由学教师学生账号快速访问  淘宝网网页版登录入口 淘宝官方网页版快捷登录  使用Pandas转换并合并DataFrame:多列映射至统一结构  2026年发布! 美少女养成动作RPG《神剑少女战记》发布实机演示  Typer应用中灵活处理命令行参数的令牌化与解析  汽水音乐在线解析 汽水音乐在线解析入口  探索高级语言到原生C/C++的转译:挑战与内存管理策略  快手网页版在线登录 快手网页版官网入口快速访问  抖音DOU+怎么投最有效 抖音付费推广的ROI提升技巧  Lar*el DB::listen 事件中的查询执行时间单位解析  C#中解析不规范的HTML为XML 常见的坑与解决办法  微博网页版主页入口 微博官方网站免登录访问  qq音乐在线播放入口_qq音乐电脑版登录链接  解决Python logging 中 datefmt 导致时间戳固定不变的问题  Angular响应式表单:实现提交后表单及按钮的禁用与只读化  c++中为什么推荐使用using替代typedef_c++现代化类型别名  包子漫画官方网站在线链接-包子漫画在线阅读平台主页地址  Golang如何测试channel通信行为_Golang channel通信测试与分析方法  Yandex免登录网页版地址 Yandex搜索引擎官方访问入口  在命令行怎么运行html项目_命令行运行html项目方法【教程】  解决 MongoDB 聚合查询中对象数组 _id 匹配问题  QQ邮箱在线使用入口 QQ邮箱个人账号网页版登录  小米汽车11月交付量突破40000台!雷军:将继续努力  Golang如何实现简单的Web表单_Golang表单提交与验证处理方法  Golang切片为何属于引用类型_Golang slice底层结构与引用语义说明 

搜索