
队列2026-08-29
优先级队列
队列堆排序竞赛
优先级队列
就是封装好的堆排序
:one:默认大根堆,即从大到小输出
#include<iostream>
#include<queue>
#include<vector>
using namespace std;
int main()
{
vector<int>a{ 5,4,3,1,2 };
priority_queue<int>q(a.begin(), a.end());
//priority_queue<int, vector<int>, less<int>>q(a.begin(), a.end());
while (!q.empty())
{
cout << q.top() << " ";//访问堆顶元素
q.pop();//弹出堆顶元素
}
return 0;
}
:two:如果想要小根堆,即从小到大输出
#include<iostream>
#include<queue>
#include<vector>
using namespace std;
int main()
{
vector<int>a{ 5,4,3,1,2 };
priority_queue<int,vector<int>,greater<int>>q(a.begin(), a.end());
while (!q.empty())
{
cout << q.top() << " ";//访问堆顶元素
q.pop();//弹出堆顶元素
}
return 0;
}
:three:比较自定义类型
得重写模板类,尽量别用,没吃透
#include<iostream>
#include<queue>
#include<vector>
using namespace std;
struct node
{
int x, y;
};
template <class T>
struct cmp {
bool operator()(const T& _Left, const T& _Right) const {
return _Left.x > _Right.x;
}
};
int main()
{
vector<node>a{ {5,6},{3,4},{1,2} };
priority_queue<node,vector<node>,cmp<node>>q(a.begin(), a.end());
while (!q.empty())
{
cout << q.top().x << " " << q.top().y << endl;
q.pop();
}
return 0;
}