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;
}

相关内容

热门资讯

瞄准未获Mythos使用权限的... 法国AI初创公司Mistral AI正与欧洲多家 银行洽谈,计划部署其对标Anthropic PBC...
一件代发怎么找云仓?按这四步走... 想做无货源电商,或者想把自己从打包发货中解放出来,“一件代发”是电商卖家无法绕不开的。问题来了,市面...
优化房地产政策促市场热度提升 4月28日召开的中共中央政治局会议指出,要努力稳定房地产市场。近期,多城市调整优化房地产调控政策,从...
“视听北京·金融作品征集”活动... 2026年5月13日,第六届中国(北京)广电媒体融合发展大会“金融新视界・视听新动能”金融与视听产业...
黄金走势图蓄势反弹 低成本布局... 来源:环球市场播报 如果你一直在关注SPDR 黄金份额 ETF(GLD),会发现金价近期处于盘整震荡...
马斯克点赞宇树载人机甲:很酷 站长之家(ChinaZ.com)5月13日 消息:宇树科技在5月12日扔出了一颗重磅炸弹。这家公司正...
「数据看盘」IM期指空头大幅加... 龙虎榜方面,红板科技获多家量化资金和游资的关注,获一家量化(摩根大通中国银城中路)买入0.62亿,遭...
原创 今... 2026年5月13日金价:大家不必继续盲目等待了!接下来,金价有可能会重演历史! 国内黄金价格继续处...
“中国最大AI包工头”冲击IP... 记者|鄢银婵 编辑|何小桃 廖丹 杜恒峰 校对|金冥羽 2026年4月29日,上海基流科技股份有限公...
白敬亭沈腾成立开门见衫公司 大象新闻记者 林林 天眼查App显示,5月12日,上海开门见衫品牌管理有限公司成立,法定代表人为上官...
原创 从... 今天来给大家聊一下中国磷化铟。2026年第一季度,全球前六大光模块厂商,中国占据四席;800G和1....
财报会释放重要信号,吴泳铭解读... 新京报贝壳财经讯(记者程子姣)5月13日,阿里巴巴集团发布2026财年第四季度与全年财报。在当晚的财...
抖音让大流量转化为大消费 “3、2、1,上链接!”不再是一句直播间的卖货口号,而是吃喝玩乐一站式服务的标语。文旅风光、特色餐饮...
千亿资本开支换来自由现金流转负... AI行业的竞争已从“模型竞赛”转入“算力消耗战”,为了应对这一趋势,阿里也正在大举进行新一轮AI基础...
原创 美... 美国诺克斯堡金库,那座号称囤积了4500吨黄金的神秘仓库,再次成为舆论焦点。而美国总统特朗普,这位以...
东方嘉富人寿:童超当选公司董事... 北京商报讯(记者 李秀梅)5月13日,东方嘉富人寿保险有限公司(以下简称“东方嘉富人寿”)公告,根据...
布朗32分孙铭徽复出 浙江广厦... 【搜狐体育战报】北京时间5月13日CBA季后赛,主场作战的浙江浙商证券以91-67击败山西汾酒,伤缺...
原创 外... 外汇储备被网友戏称为“金融核武”,因为其不仅在稳定汇率、保障经济安全上发挥关键作用,还有助于推动人民...
美股首只纯存储ETF,刷新华尔... 财联社5月13日讯(编辑 史正丞)近期存储芯片板块的猛烈上涨,使得一只成立不到6周的ETF成为华尔街...