STL——容器(Set & multiset)之 仿函数(函数对象)functor 的用法
Set/multiset 中元素的存储数据总是会按照从大到小或者从小到大排列,这个是怎么实现的?这就要说 “仿函数” 这个概念了。
仿函数概念
1. 尽管函数指针被广泛用于实现函数回调,但C++还提供了一个重要的实现回调函数的方法,那就是函数对象。
2. functor,翻译成函数对象,伪函数,它是是重载了“()”操作符的普通类对象。从语法上讲,它与普通函数行为类似。
3. functional 头文件中包含的 greater<> 与 less<> 就是函数对象。
下面举出 greater<int> 和 less<int> 的简易实现原理,set/setmulti 容器就是调用函数对象的 operator() 方法去比较两个值的大小。
因为重载了(),greater 或 less 这两个函数对象(别纠结这是struct 还是 class),你完全可以吧他们当做函数去使用,
1 struct greater 2 { 3 bool operator()(const int& iLeft, const int& iRight) 4 { 5 return (iLeft>iRight); 6 } 7 } 8 9 struct less 10 { 11 bool operator()(const int& iLeft, const int& iRight) 12 { 13 return (iLeft<iRight); 14 } 15 }
在 Set/multiset 的源码中默认有 greater<> 与 less<> 的调用,如下:
上图这是一个类模板,其53行就是这个模板的参数列表,less其实是一个结构体,但他 operator 了括号,我们可以把当做函数去使用,它包含在头文件 <functional> 中,他是一个比较函数,其原型:
第126行便是其重载,如果左值小于右值便返回 True 否则返回 False。
第108行-117行便是 greater<> 的实现。每次传参数进来,用现有左值与右值比较,如果判断结果为 True 或False 便将值放置到左边或者右边。
=======================================================================================================================
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报