新闻中心

c++ sort函数怎么自定义比较函数_c++排序自定义规则实现

2025-11-03
浏览次数:
返回列表
c++kquote>答案是使用比较函数、函数对象或Lambda表达式可实现std::sort自定义排序。1. 函数指针用于基本类型降序或自定义逻辑;2. 结构体排序需按字段写比较函数,如先按分数后按名字;3. Lambda表达式更简洁,推荐现代C++使用;4. 函数对象适合有状态或复用场景。

c++ sort函数怎么自定义比较函数_c++排序自定义规则实现

在C++中使用std::sort函数时,如果需要按照自定义规则排序,可以通过传入比较函数、函数对象(仿函数)或Lambda表达式来实现。默认情况下,sort按升序排列基本类型,但对复杂数据类型(如结构体、类对象)或特殊排序需求,必须自定义比较逻辑。

1. 使用函数指针作为比较函数

最常见的方式是定义一个返回bool类型的函数,接受两个参数,当第一个参数应排在第二个之前时返回true

// 按整数降序排列
```cpp bool cmp(int a, int b) { return a > b; // a 在 b 前面的条件 } std::vector nums = {3, 1, 4, 1, 5}; std::sort(nums.begin(), nums.end(), cmp); ```

2. 结构体或类对象排序

对自定义类型排序时,比较函数需根据具体字段判断顺序。

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

// 按分数从高到低,分数相同时按名字字典序 bool cmpStudent(const Student& a, const Student& b) { if (a.score != b.score) { return a.score > b.score; } return a.name

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

<H3>3. 使用Lambda表达式(推荐现代C++写法)</H3>
<p>Lambda更简洁,适合简单逻辑,可直接在<code>sort</code>调用中定义。</p>
                    <div class="aritcle_card">
                        <a class="aritcle_card_img" href="/ai/2142">
                            <img src="https://img.php.cn/upload/ai_manual/000/000/000/175680148596213.png" alt="Pippit AI">
                        </a>
                        <div class="aritcle_card_info">
                            <a href="/ai/2142">Pippit AI</a>
                            <p>CapCut推出的AI创意内容生成工具</p>
                            <div class="">
                                <img src="/static/images/card_xiazai.png" alt="Pippit AI">
                                <span>133</span>
                            </div>
                        </div>
                        <a href="/ai/2142" class="aritcle_card_btn">
                            <span>查看详情</span>
                            <img src="/static/images/cardxiayige-3.png" alt="Pippit AI">
                        </a>
                    </div>
                
```cpp
std::vector<int> nums = {3, 1, 4, 1, 5};
std::sort(nums.begin(), nums.end(), [](int a, int b) {
    return a < b;  <font color="green">// 升序</font>
});

对结构体:

```cpp std::sort(students.begin(), students.end(), [](const Student& a, const Student& b) { if (a.score == b.score) { return a.name b.score; }); ```

4. 使用函数对象(仿函数)

适用于需要状态或复用的场景。

```cpp struct CmpByLength { bool operator()(const std::string& a, const std::string& b) { return a.length() std::vector<:string>words = {"hi", "hello", "c++"}; std::sort(words.begin(), words.end(), CmpByLength());

<strong>注意事项:</strong>
<ul>
  <li>比较函数必须满足<strong>严格弱序</strong>:即<code>cmp(a,a)</code>必须为false,且若<code>cmp(a,b)</code>为true,则<code>cmp(b,a)</code>不能为true。</li>
  <li>传递给<code>sort</code>的比较逻辑应保证可预测、无副作用。</li>
  <li>使用引用传参(尤其是结构体)避免拷贝开销。</li>
</ul>

基本上就这些。根据实际需求选择合适方式,Lambda最常用也最直观。

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


# 第一个  # 重庆网站推广公司招商  # seo优化独特见解  # 网站推广产品有哪些  # 山东关键词排名好不好  # 模型场景网站推广怎么做  # 卡车营销推广怎么做的  # 武昌做网站建设的公司  # 网站seo靠什么  # 毕节新闻推广营销方案  # seo什么星座  # 尤其是  # word  # 降序  # 文档  # 复用  # 数据结构  # 升序  # 有什么  # 如何使用  # 自定义  # 排列  # c++ 


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


相关推荐: 《噬血代码2》新预告片发布 展示游戏剧情  Golang如何使用buffered channel提高性能_Golang buffered channel优化技巧  AO3中文官网链接_AO3网页版稳定镜像站  快手极速版在线观看 官方网页版登录地址  c++项目目录结构应该如何组织_c++工程化项目结构规范  React Router 嵌套组件中 URL 重定向问题的解决方案  如何在网页中实现特定地点的随机图片展示  抖音极速版最新版本 抖音极速版官方下载地址  J*aScript教程:根据元素文本内容动态设置背景色  网易大神怎么保存别人动态的图片_网易大神动态图片保存方法  谷歌google账号注册详细步骤 谷歌账号注册官方教程  mysql密码锁定怎么解锁_mysql密码锁定解锁后修改密码步骤  windows10怎么关闭系统提示音_windows10彻底静音设置方法  QQ官网正版登录链接 QQ在线登录入口最新  腾讯视频怎么使用多账号家庭管理_腾讯视频家庭多账号统一管理与权限分配教程  零跑汽车11月交付量达70327台 实现连续9个月正增长  b站怎么删除评论_b站评论管理与删除操作  TikTok国际版官网直达_TikTok国际版官网直达进入在线观看  UE5.7引擎表现爆炸优化无敌!5090跑4K稳定60FPS  css滚动区域卡顿如何改善_css滚动问题用will-change优化渲染  Excel如何用迷你图显趋势_Excel用迷你图显趋势【趋势小图】  移动端XML文件怎么转换成Excel 手机和平板上的解决方案  Sublime怎么配置Nim语言环境_Sublime Nim代码高亮与补全  批改网学生版PC登录 批改网官网登录系统入口  解决移动端滚动问题的overflow属性应用指南  如何在Promise链中有效终止错误处理后的执行  在WordPress中通过REST API获取BasicAuth保护的远程文章  mcjs网页版在线存档 mcjs云存档登录入口  优化 Python 函数中的条件逻辑:解决 if-else 嵌套与参数选择问题  蛙漫安全无毒 官方认证的绿色入口  mc.js游戏直达 mc.js网页免下载版本秒进地址  NRF24L01数据传输深度解析:解决大载荷接收异常与分包策略  必由学官方网站入口 必由学学生教师共用登录通道  如何使用Go和Martini动态服务解码后的图片  CKEditor 5 自定义构建在React应用中渲染失败的调试与解决  Golang并发任务中错误如何聚合_Golang goroutine error收集方式  Win10如何开启蓝牙功能_Windows10找不到蓝牙开关解决方法  如何将一个大型PHP应用拆分为多个Composer包_微服务与模块化架构的Composer实践  为什么简单的XML文件也会解析失败? 检查隐藏的非打印字符(如BOM)的方法  智慧团建扫码登录入口 智慧团建扫码登录入口官网版​  Win10磁盘清理工具在哪 Win10打开并使用磁盘清理【教程】  Win10快速启动功能利弊分析 Win10开启或关闭快速启动教程【技巧】  微博网页版官方账号登录 微博网页版内容浏览使用指南  Windows电脑怎么截图最方便_系统自带截图工具的5种神仙用法【技巧】  漫蛙2漫画入口 漫蛙正版网页漫画直达网址  Go语言HTML解析:利用Goquery精准获取指定元素内容  Go与Ruby之间实现AES加密互通:CFB模式下的密钥长度匹配策略  GemBox Document HTML转PDF垂直文本渲染问题及解决方案  J*aScript异步迭代器_j*ascript异步遍历  手机屏幕碎了但能正常使用怎么办 手机外屏碎裂的修复建议 

搜索