priority_queue:优先级队列(本质就是堆)
堆:完全二叉树+条件:任意节点都要比其孩子节点小(大)----》小堆(大堆)
1.包含<queue>头文件+std
2.底层就是堆
3.模板参数列表说明:
构建:
#include<iostream>
using namespace std;
#include<queue>
#include<functional>
int main()
{
priority_queue<int > q; //默认创建的大堆
priority_queue<int, vector<int>, greater<int>>q1; //建小堆
//区间方式构建
int array[] = { 5, 9, 2, 1, 0, 4, 6, 3, 4, 7 };
priority_queue<int> q2(array, array + sizeof(array) / sizeof(array[0]));
vector<int> v{ 5, 9, 2, 1, 8, 3, 7, 4, 0, 6 };
priority_queue<int> q(v.begin(), v.end());
}
关于比较方式:
1.如果优先级队列中放的是内置类型元素,比如:int,double等,直接使用STL提供less和greater类模板来比较即可。
注意: less是按照小于方式比较 greater是按照大于方式比较
使用less和greater的时候,需要包含<functional>头文件 指针除外
2.如果优先级队列中方式的是自定义类型的元素,需要用户自己提供元素和元素的比较方式 less和greater不能比较自定义类型的元素
方式一:可以在类中自己根据需要重载 <或者>
方式二:函数 指针
方式三:借助仿函数(仿函数 可以向函数一样调用对象成为函数对象)
实现方式:在类中只需要将函数调用运算符重载即可---->所谓的函数调用运算符就是()
top-K:在一个数据集中找前k个最大或最小的元素
解决top-k问题最佳的方式就是使用堆(优先级队列)
方式:
1.先利用前k个元素建堆
注意:前k个最大的元素------>创建小堆 前k个最小的元素 ---->创建大堆
2.用剩余的N-k个元素依次和堆顶元素比较,如果大于堆顶的元素则替换(找前k个最大的元素)