priority_queue
T:优先级队列,确保优先级别最高的元素总是位于头部。
默认less 大顶堆 堆顶元素大 (大哥大)
greater 小顶堆 堆顶元素小
为何less表示大顶堆呢,原因在于 使用 < 比较,堆下<堆上
priority_queue<int, vector<int>, greater<int> > q;
自建比较函数
一般有四种方式,其中struct和class都是通过重载()运算符实现,另外两种方式是C++11的新特性,借助函数指针和lambda表达式,以Leetcode合并k个升序链表为例
利用decltype + 函数可以自动判别函数类型,具体类型为function<bool(ListNode*,ListNode*)>
至于为什么需要pq(cmp)这需要去看下源码,原因在于没有一般的函数是没有构造函数去初始化比较算子,可参考第二篇文章
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
// 函数指针方式:如果作为类成员函数,一定要声明static
static bool com( ListNode* a, ListNode* b){
return a->val > b->val;
}//decltype(&com)搭配使用
struct cmp{
bool operator()(ListNode* l1,ListNode* l2){
return l1->val > l2->val;
}
};
ListNode* mergeKLists(vector<ListNode*>& lists) {
auto cmpl=[](ListNode* a, ListNode* b)->bool{
return a->val >b->val;
};//lambda表达式
// priority_queue<ListNode*,vector<ListNode*>,decltype(cmpl)> pq(cmpl);
//priority_queue<ListNode*,vector<ListNode*>,decltype(&com)> pq(com);
priority_queue<ListNode*, vector<ListNode*>, cmp> pq;//小顶堆
for(ListNode* i:lists){//类型为指针
if(i!=nullptr){//判断是否为nullptr
pq.push(i);
}
}
ListNode* dummy= new ListNode(-1);//哨兵,记录头结点
ListNode* p=dummy;
while(!pq.empty()){
ListNode* tmp=pq.top();
pq.pop();
if(tmp->next){//使用if 而非while,原链表已经排序了,只需要推入下一个即可,堆会自动排好
// note nullptr
pq.push(tmp->next);
}
p->next=tmp;
p=p->next;
}
return dummy->next;
}
};
参考
https://blog.csdn.net/qq_21539375/article/details/122128445
关于priority_queue和sort的第三个参数
(190条消息) C++ priority_queue用法(大顶堆,小顶堆)_MingjaLee的博客-CSDN博客_c++ 大顶堆