新闻中心

C++如何使用自定义比较函数_C++ sort算法与仿函数struct用法

2025-12-02
浏览次数:
返回列表
答案:C++中sort默认升序,可通过函数指针、仿函数或lambda实现自定义排序。①函数指针需全局或静态函数,如降序比较;②仿函数重载operator(),可保存状态且支持内联优化,适用于复杂逻辑;③lambda表达式(C++11起)更简洁,适合简单排序规则,如按姓名升序或成绩降序。三种方式均作为第三个参数传入sort。

c++如何使用自定义比较函数_c++ sort算法与仿函数struct用法

在C++中,sort 算法默认对元素进行升序排列,但很多时候我们需要按照特定规则排序,比如降序、按绝对值排序、自定义对象比较等。这时就需要使用自定义比较函数仿函数(functor)。下面详细介绍这两种方法的用法。

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

你可以定义一个普通函数,接收两个参数,返回是否第一个应排在第二个之前(即“小于”关系)。

bool compare(int a, int b) { return a > b; // 降序排列 } int main() { std::vectorint> vec = {5, 2, 8, 1}; std::sort(vec.begin(), vec.end(), compare); // 结果:8 5 2 1 return 0; }

注意:这个函数必须是全局函数或静态函数,不能是普通成员函数(除非配合绑定)。

使用仿函数 struct 实现比较逻辑

仿函数是重载了 operator() 的类或结构体。它比函数指针更灵活,支持状态保存和内联优化。

struct CompareByAbs { bool operator()(int a, int b) const { return abs(a) // 按绝对值升序 } }; int main() { std::vectorint> vec = {-3, 1, -2, 4}; std::sort(vec.begin(), vec.end(), CompareByAbs()); // 结果:1, -2, -3, 4(绝对值从小到大) return 0; }

这里 CompareByAbs() 是构造一个临时对象传给 sort,sort 内部会调用它的 operator() 进行比较。

对自定义类型使用仿函数排序

假设你有一个表示学生的结构体,想按成绩排序:

SCISPACE SCISPACE

AI论文研究助手,探索和解释论文的平台

SCISPACE 65 查看详情 SCISPACE struct Student { std::string name; int score; }; struct SortByScore { bool operator()(Student a, Student b) const { return a.score > b.score; // 成绩从高到低 } }; int main() { std::vector students = { {"Alice", 85}, {"Bob", 92}, {"Charlie", 78} }; std::sort(students.begin(), students.end(), SortByScore()); // 按成绩降序排列 return 0; }

仿函数可以访问结构体的 public 成员,实现灵活的排序逻辑。

Lambda 表达式:更简洁的替代方式(C++11起)

对于简单逻辑,lambda 更直观:

std::sort(vec.begin(), vec.end(), [](Student a, Student b) { return a.name // 按姓名字典序 });

lambda 本质上是编译器生成的仿函数,写起来更紧凑。

基本上就这些。掌握函数指针、仿函数 struct 和 lambda,就能灵活控制 sort 的行为。仿函数适合复杂或复用场景,lambda 适合简单匿名逻辑。

以上就是C++如何使用自定义比较函数_C++ sort算法与仿函数struct用法的详细内容,更多请关注其它相关文章!


# 就能  # 宜兴企业网站建设费用  # 微信营销转发推广软件  # 学校网站网站建设  # 远象建设 网站  # 房开企业营销推广费  # 通化网站优化费用标准文件  # 义乌关键词排名项目  # 江夏seo优化多少钱  # 食品网站优化调研报告  # SEO是否还要考核流量  # 数独  # ai  # 第一个  # 你可以  # 如何实现  # 如何用  # 如何使用  # 降序  # 升序  # 自定义  # 排列  # c++ 


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


相关推荐: Android Studio计算器C键功能异常排查与修复教程  拷贝漫画电脑版官网入口 拷贝漫画(PC版)在线直达  Go语言中Map值调用指针接收器方法的限制与应对  高德地图总提示网络异常怎么办 高德地图离线导航设置与网络排查方法  厨房不锈钢水槽发黑生锈怎么处理_水槽用可乐+锡纸2分钟抛亮如新  Bilibili动漫最新防封地址发布-Bilibili动漫2025年最稳正版入口推荐  俄罗斯Yandex免登录入口_Yandex搜索引擎官网一键直达  CSS布局中意外空白:解决padding-top导致的顶部间距问题  谷歌google账号注册详细步骤 谷歌账号注册官方教程  c++中的std::basic_string的SSO优化_c++短字符串优化深度解析  在Typer应用中优雅地处理和重组任意命令行参数  我的世界官方游戏入口 我的世界官网平台直达链接  深入理解J*a链表中的IPosition接口与使用  python3时间如何用calendar输出?  谷歌浏览器浏览体验优化_谷歌浏览器新版直连永久可用提示  零跑汽车11月交付量达70327台 实现连续9个月正增长  使用 Pandas 高效处理 .dat 文件:数据清洗与数值计算实战  PS5 Pro有点优势但不多! 《燕云十六声》PS5平台与PC性能画面对比  C++ explicit关键字防止隐式转换_C++构造函数安全规范  蛙漫安全无毒 官方认证的绿色入口  向日葵客户端怎么进行远程CentOS控制_向日葵客户端远程CentOS控制操作教程  AO3中文官网链接_AO3网页版稳定镜像站  Win11网速慢怎么解决 Win11网络设置优化解除限速  神庙逃亡小游戏在线玩 神庙逃亡小游戏入口  c++如何使用折叠表达式(Fold Expressions)_c++17可变参数模板新技巧  C++ vector二维数组定义_C++ vector of vector用法  生成rdflib自定义SPARQL函数:参数匹配与实践指南  SteamMachine定价或为699美元 大家想入手吗?  Django模型中自动计算可用余额的实现方法  抓大鹅解压小游戏 抓大鹅摸鱼解压入口  J*aScript中安全有效地处理localStorage字符串数据  Go语言中高效处理x-www-form-urlencoded表单数据  抖音商城签到领现金是真的吗_抖音商城签到奖励与提现说明  QQ邮箱登录官网首页 腾讯QQ邮箱网页入口  sublime如何配置Go语言开发环境_sublime搭建Golang编译运行系统  Golang如何实现简单的Web表单_Golang表单提交与验证处理方法  外媒分析《GTA6》定价:卖100美元可以但真没必要!  韩剧圈正版入口页面_韩剧圈官网登录链接  三星ZFold5多任务卡顿_Samsung ZFold5流畅度提升  如何创建独立于主系统的J*a运行环境_隔离式环境搭建策略  使用Pandas转换并合并DataFrame:多列映射至统一结构  理解J*aScript Promise的微任务队列与执行顺序  夸克浏览器网页版最新地址 夸克浏览器官方入口合集  2306选座时如何选靠窗位置_12306选座靠窗座位查看方法解析  Golang如何测试channel通信行为_Golang channel通信测试与分析方法  快手极速版在线观看 官方网页版登录地址  三星GalaxyZFold5怎样在相册制作折叠屏分镜_iPhone三星GalaxyZFold5相册制作折叠屏分镜【创意编辑】  俄罗斯Yandex搜索引擎入口_Yandex官网免登录一键访问  自定义Bag-of-Words实现:处理带负号的词汇权重  PDF怎么合并PDF并保持格式_PDF合并文件保持排版教程 

搜索