优先队列
在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出 (first in, largest out)的行为特征。
首先要包含头文件#include<queue>
, 他和queue
不同的就在于我们可以自定义其中数据的优先级, 让优先级高的排在队列前面,优先出队。
优先队列具有队列的所有特性,包括队列的基本操作,只是在这基础上添加了内部的一个排序,它本质是一个堆实现的。
堆就是如下二叉树,时间负责度是O(Logn)
基本操作
- push
- top
- empty
- size
- emplace
- swap
定义:priority_queue<Type, Container, Functional>
Type
就是数据类型,Container
就是容器类型(Container
必须是用数组实现的容器,比如vector
,deque
等等,但不能用 list
。STL里
面默认用的是vector),Functional
就是比较的方式。
当需要用自定义的数据类型时才需要传入这三个参数,使用基本数据类型时,只需要传入数据类型,默认是大顶堆。
大顶堆与小顶堆
//升序队列,小顶堆(小的在最前面)
priority_queue <int,vector<int>,greater<int> > q;
//降序队列,大顶堆(大的再最前面)
priority_queue <int,vector<int>,less<int> >q;
//greater和less是std实现的两个仿函数(就是使一个类的使用看上去像一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了)
自定义比较函数
#include <iostream>
#include <queue>
#include <string>
#include <vector>
using namespace std;
int main() {
auto cmp = [](int c, int b) -> bool { return c * c < b * b; };
priority_queue<int, vector<int>, decltype(cmp)> a(cmp);
a.push(-2);
a.push(3);
a.push(1);
a.push(0);
while (!a.empty()) {
cout << a.top() << " ";
a.pop();
}
}
输出
3 -2 1 0
- 以自定义结构作为元素的优先队列需要单独编写比较函数,可以使用lambda表达式,并用
decltype(cmp)
推导类型