c++优先队列priority_queue(自定义比较函数)
2021/12/24 17:07:13
本文主要是介绍c++优先队列priority_queue(自定义比较函数),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
c++优先队列(自定义比较函数)
- 方式一:struct重载运算符()
- 方式二:class重载运算符()
- 方式三:定义函数
- 方式四:lambda表达式
- 方式五:function包装lambda表达式
可以使用现成的
less<T>
来定义大顶堆
greater<T>
来定义小顶堆
从文档出可以看到,传入的可以是 函数指针或者 函数对象(类对操作符()进行了重载,)
参考链接:函数指针和函数对象
参考链接:decltype
方式一:struct重载运算符()
通过struct重载()操作符,定义了一个函数对象
struct cmp{ bool operator()(vector<int>&a,vector<int>&b){ return a[0]>b[0]; } }; priority_queue<vector<int>,vector<vector<int>>,cmp> q;//小顶堆
这是属于传入 函数对象 的方式
方式二:class重载运算符()
通过class重载()操作符,定义了一个函数对象
注意要加public
class cmp{ public: bool operator()(vector<int>&a,vector<int>&b){ return a[0]>b[0]; } }; priority_queue<vector<int>,vector<vector<int>>,cmp> q;//小顶堆
这是属于传入 函数对象 的方式
方式三:定义函数
首先定义一个比较函数
bool cmp(vector<int>&a,vector<int>&b){ return a[0]>b[0]; }
decltype()是用于获得函数指针的 类型的。在模板中也要传入它们的类型。
decltype()要传入的是一个对象的地址,因此需要对cmp加取值符,&cmp为对象的地址
因此可以由函数地址cmp
转为函数指针 类型 decltype(&cmp)
priority_queue<vector<int>,vector<vector<int>>,decltype(&cmp)> q;//小顶堆
这是属于传入 函数指针的方式。
方式四:lambda表达式
和方式三 相同,只不过用lambda表达式来定义函数。
同样需要decltype(&cmp) 先将函数地址转为对象地址(&cmp),再转为函数对象的类型
bool cmp=[](vector<int>&a,vector<int>&b){ return a[0]>b[0]; }; priority_queue<vector<int>,vector<vector<int>>,decltype(&cmp)> q;//小顶堆
这是属于传入 函数指针的方式。
方式五:function包装lambda表达式
由于function对lambda函数进行了包装 ,cmp本身就是一个对象地址。(function对象)
直接decltype(cmp)获得函数指针 的类型。
function<bool(vector<int>&,vector<int>&)> cmp=[](vector<int>&a,vector<int>&b){ return a[0]>b[0]; }; priority_queue<vector<int>,vector<vector<int>>,decltype(cmp)> q;//小顶堆
这是属于传入 函数指针的方式。
这篇关于c++优先队列priority_queue(自定义比较函数)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-29从 Elastic 迁移到 Easysearch 指引
- 2024-12-29uni-app 中使用 Vant Weapp,怎么安装和配置npm ?-icode9专业技术文章分享
- 2024-12-27Nacos多环境配置学习入门
- 2024-12-27Nacos快速入门学习入门
- 2024-12-27Nacos快速入门学习入门
- 2024-12-27Nacos配置中心学习入门指南
- 2024-12-27Nacos配置中心学习入门
- 2024-12-27Nacos做项目隔离学习入门
- 2024-12-27Nacos做项目隔离学习入门
- 2024-12-27Nacos初识学习入门:轻松掌握服务发现与配置管理