C++仿函数
admin
2024-02-21 06:07:50
0

仿函数

仿函数又称为函数对象,是一种能够行使函数功能的类,该类重载了operator()运算符,调用仿函数的时候实际上就是通过类对象调用重载后的operator操作符,重载operator()和重载普通的函数效果相同,当参数类型不同时会执行不同的代码逻辑。仿函数使用
比如自定义了一个仿函数A

#include 
#include 
using namespace std;
class A{
public:
int operator() (int a, int b){
return a+b;
}
double operator() (double a, double b){
return (a+b)*2;
}
};
int main(){
A a;
auto c1 = a(1, 2);
cout << typeid(c1).name() << " " << c1 << endl;
auto c2 = a(11.3, 2.4);
cout << typeid(c2).name() << " " << c2 << endl;
}

C++标准库中的仿函数存在在于functional.h中,平时用到的最多的是greater,less这两个,这两个函数常被用做排序函数的参数。在排序函数中greater和less这两个函数可以被等效的lambda表达式替换。但是在优先队列中,不能直接使用lambda表达式替换。

所以才会接触到仿函数这个概念。优先队列自定义比较规则,可以使用仿函数或者对被比较的类重载小于操作符。由于C++规定操作符重载必须至少有一个类类型的操作数,因此当优先队列中的元素不是自定义类的时候,则没法对其重载小于操作符,此时只能实用仿函数来实现自定义的比较规则。
以下是为优先队列定义仿函数的示例

#include 
#include 
#include 
using namespace std;
class comp{
public:
bool operator(const pair &a, const pair &b) {
return a.second < b.second;
}
};
int main(){
priority_queue, vector>, comp> q;
q.push({1,3});
q.push({2,4});
q.push({3,6});
auto p = q.top();
cout << p.first << " " << p.second << endl;
}

函数对象 vs 模板类型参数
很多人C++初学者会有这样的疑惑,在sort中可以使用lambda,而在优先队列的定义中不能使用,相反,在优先队列中可以使用仿函数,而在sort中则不能使用仿函数。
这个问题的根源在于没有分清楚仿函数(函数对象)和模板类型参数之间的关系。
sort函数的原型为

template 
void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);

可以看到 comp是一个函数对象,因为lambda对象也属于函数对象,所以可以作为排序的参数。C++中凡是能够调用()运算符的就都是函数对象,包括函数、函数指针、重载了()运算符的对象,以及lambda对象。
优先队列的构造函数原型为

template<
class T,
class Container = std::vector,
class Compare = std::less
> class priority_queue;

填入尖括号中的应该是类型的名字,即typename,当然不能使用lambda作为typename,但是我们使用decltype来获得lambda的类型,作为typename,然后在构造函数的参数中把lambda示例传进去,就能work。
示例如下

#include
#include
using namespace std;
int main(){
auto comp = [](const pair &a, const pair &b){
return a.second < b.second;
};
priority_queue, vector>, decltype(comp)> q(comp);
q.push({1,3}); q.push({2,4}); q.push({3,6});
auto p = q.top();
cout << p.first << " " << p.second << endl;
}

相关内容

热门资讯

怎么回收金项链 南昌本地黄金回... 近年来,随着黄金价格波动,不少持有闲置黄金制品的用户会产生变现需求,其中回收金项链是较为常见的用户需...
两仓同开叮咚买菜进驻淮安 升级... 7月5日,主打“在线菜篮子”的生鲜电商叮咚买菜淮安楚州站、府苑站双站同步开仓运营,标志着叮咚买菜正式...
防范美股泡沫爆破带来的风险外溢 我们先来梳理全球市场,判断哪些市场走势具备前瞻参考价值。 第一是恒生指数,第二是恒生科技指数,这两大...
央视曝光黄金回收“作弊秤”!一... 有消费者投诉在黄金回收交易中遭遇了“违规秤”,造成了不小的经济损失。记者了解到,眼下市场上售价利润最...
单仁:字节全员信背后,AI正在... 01 最近这几天,字节跳动CEO梁汝波的全员信,引起了很多企业家的关注。 表面上看,这只是一个大厂时...
2026麻涌镇企业短视频制作:... 麻涌镇企业短视频制作是以本地制造业与服务业诉求的内容生产与平台运营服务,2026年,这一行业的竞争核...
4nm近售罄、部分8nm接近满... 《科创板日报》7月4日讯据朝鲜日报报道,业内人士称,随着AI半导体需求升温、全球大型科技公司订单增加...
新思考电机冲刺港股:4个月营收... 雷递网 雷建平 7月5日 新思考电机日前更新招股书,准备在港交所上市。 新思考电机最近一次融资是2...
端午只吃粽子就够了吗?上海歧黄... 端午一到,粽叶香、艾草香、咸鸭蛋和家常菜的味道,就把节日气氛拉满了。很多人一提到端午饮食,第一反应就...
整顿AAA评级 记者 蔡越坤 2026年6月以来,在国内某头部评级机构工作的周宇感到压力骤增。 随着6月30日、7月...
原创 必... 很多人一看到“必胜客被卖了”,第一反应就是:这牌子是不是不行了? 可现实偏偏很拧巴。 一边是美国那边...
原创 美... 无视美国制裁,采购伊朗石油,这样的“硬骨头”,放眼世界也只有一个。 为了继续施压伊朗,美国可以说是什...
布米普特拉北京投资基金管理有限... 美国私营部门就业市场在六月份释放出温和降温的信号。根据薪资服务商ADP最新发布的报告,当月企业新增就...
原创 女... 去年底一次聚餐,桌上放着几支口红、一瓶香水,还有一个印着大牌标识的小盒子。有人随手拿起来说,这是代购...
原创 蚂... “灵活用工第一股”来了! 作者|刘俊群 编辑|刘钦文 你在奶茶店、餐厅、商超、酒店里遇到的兼职店员,...
原创 还... 中国与美国这两个大国的任何一个细微动作,似乎都会牵动全球金融市场的神经,引发一连串连锁反应。本就还剩...
从“固定区间”到“动态指数”,... 银行理财产品业绩基准展示方式正迎来新变化。7月5日,北京商报记者梳理发现,包括中邮理财、民生理财、华...
兰格钢铁杭州建材周报(七月第一... 来源:兰格钢铁网 兰格钢铁杭州建材周报(七月第一周) 本周(6.29-7.3)杭州建筑钢材市场现货...
全球存储巨头,拟涨价20% 来源:上海证券报 7月3日,据韩媒ZDNET Korea报道,三星电子正在与客户展开第三季度通用DR...
近视、远视、斜视、弱视,同样是... 听说孩子看不清黑板,很多家长第一反应就是“近视了”,于是直接带去眼镜店配副眼镜应付。但很多朋友不知道...