优先队列
优先队列的出队顺序是按照优先级来的,可以找到最小或者最大元素,同时支持插入或者删除最小最大元素。
优先队列的格式:
priority_queue<T, Container, Compare>
T:队列中元素的数据类型
Container: 用于储存和访问队列元素的底层容器的类型。
Compare: 比较关系,默认是数值上的小于关系(return a<b),比如1<2,6<7,此时队列中元素由队头到队由大到小排列,采用默认compare时此参数可以省去。
优先队列支持的操作如下:
(1)priority_queue::empty()
判断队列是否为空(也即是size是否为0),是则返回true,否则返回false。
(2)priority_queue::size()
返回队列中元素的个数。这个函数也可以用于判断队列是否为空。
(3)priority_queue::top()
返回队头元素的常引用,队头元素是在所设定的比较关系下最大也即优先级最高的元素。此函数实际上调用底层容器的front函数。
(4)priority_queue::pop()
清除队头元素。
(5)priority_queue::push(data)
给队列插入元素,新元素会按其优先级被排列到适当位置。
struct cmp{
// "<" 表示 price 大的优先级高
bool operator() (fruit f1,fruit f2){
return f1.price < f2.price;
}
};
priority_queue<fruit,vector<fruit>,cmp> q;
优先队列相关题目
求中位数
Dynamic Median
AC代码:
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
priority_queue<int, vector<int>, less<int>> que1; //最大堆
priority_queue<int, vector<int>, greater<int>> que2; //最小堆
void insert(int num) {
//让中位数位于最大堆的那个优先队列,所以最大堆只会比最小堆最多多一个元素
if(que1.empty()) {
//让中位数位于最大堆,所以首先进入的是最大堆
que1.push(num);
}
else {
if(num < que1.top(