主要参考博客:https://blog.csdn.net/weixin_36888577/article/details/79937886
优先队列的定义:priority_queue<Type, Container, Functional>
Type 就是数据类型,Container 就是容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是vector),Functional 就是比较的方式,当需要用自定义的数据类型时才需要传入这三个参数,使用基本数据类型时,只需要传入数据类型,默认是大顶堆
优先队列:大顶堆->队列数据从大到小排列(也就是说根节点每次都可以找到最大的节点,俗称大顶堆)
小顶堆->队列数据从小到大排列(也就是说根节点每次都可以找到最小的节点,俗称小顶堆)
容易被混淆的是:优先队列定义比较方式中的Functional(仿函数)的定义 ,上代码一看就懂:
#include<iostream>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
bool cmp2(int a, int b);
int main()
{
vector<int>number = {42,17,89,37,100,95};
struct cmp //仿函数 小顶堆
{
bool operator()(int a , int b)
{
return a > b;
}
};
priority_queue<int ,vector<int>,cmp> queue_;
for (int n : number)
{
queue_.push(n);
}
cout << "queue_的输出: "<<endl;
while (!queue_.empty())
{
cout << queue_.top()<<" ";
queue_.pop();
}
cout << " "<<endl;
cout << "number的输出: " <<endl;
sort(number.begin(),number.end(),cmp2);
for (int i = 0; i < number.size(); ++i)
{
cout << number[i]<<" ";
}
return 0;
}
bool cmp2(int a, int b) //函数不可以在main()函数里面定义
{
return a > b;
}
函数输出:
queue_的输出:
17 37 42 89 95 100
number的输出:
100 95 89 42 37 17
priority_queue优先队列用的 “>"大于号是小顶堆,数据从小到大输出
sort排列用的 “>"大于号是小顶堆,数据从大到小输出
下面抄了别人一段笔记,还有仿函数和函数的区别没弄明白,有时间再总结!!
//升序队列
priority_queue <int,vector<int>,greater<int> > q;
//降序队列
priority_queue <int,vector<int>,less<int> >q;
//greater和less是std实现的两个仿函数(就是使一个类的使用看上去像一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了)
大顶堆内容补充:
Heap 堆:平衡二叉树,最后一层从左到右紧密排列
pop()算法流程:
(1)移除根节点
(2)将最后元素移到根节点
(3)将子节点和父节点比较
(4)如果父节点比子节点小,则交换父子节点
(5)重复(3)(4)直到完成