admin管理员组文章数量:1623789
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(cmp);//小顶堆
写法一:
写法二:
如果作为类成员函数,一定要声明static
这是属于传入 函数指针的方式。
方式四:lambda表达式
auto cmp=[](vector<int>&a,vector<int>&b)->bool{
return a[0]>b[0];
};
priority_queue<vector<int>,vector<vector<int>>,decltype(cmp)> q(cmp);//小顶堆
这是属于传入 函数指针的方式。
方式五:function包装lambda表达式
要加入头文件#include<functional>
由于function对lambda函数进行了包装 ,cmp本身就是一个对象地址。(function对象)
直接decltype(cmp)获得函数指针 的类型。
function<bool(vector<int>&,vector<int>&)> cmp=[](vector<int>&a,vector<int>&b)->bool{
return a[0]>b[0];
};
priority_queue<vector<int>,vector<vector<int>>,decltype(cmp)> q(cmp);//小顶堆
这是属于传入 函数指针的方式。
测试用例
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
int main(){
auto cmp=[](vector<int>&a,vector<int>&b)->bool{
return a[0]>b[0];
};
priority_queue<vector<int>,vector<vector<int>>,decltype(cmp)> q(cmp);//小顶堆
q.push({3,4});
q.push({1,2});
q.push({5,6});
vector<int> vec=q.top();
q.pop();
cout<<vec[0]<<endl;
cout<<vec[1]<<endl;
system("pause");
return 0;
}
输出结果
本文标签: 自定义队列函数priorityqueue
版权声明:本文标题:c++优先队列priority_queue(自定义比较函数) 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dongtai/1728894964a1178292.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论