优先队列

之前有见到过,优先队列就是堆
但是不是很明白priority_queue这个STL容器究竟跟queue有什么区别?

STL中的 priority_queue 通常是一个最大堆,这意味着在C++中,priority_queue 默认按照最大值的顺序返回元素。但你可以通过自定义比较函数来创建最小堆。

在Java中,PriorityQueue 也是一个优先队列,通常是一个小根堆,以便按升序顺序返回元素。你可以使用 Collections.reverseOrder() 来创建一个大根堆,以便按降序顺序返回元素。

#include<iostream>
// 头文件与队列相同,不用引入单独的头文件,同时也不需要引入vector头文件
#include<queue>
using namespace std;
// 优先队列数据结构
int main() {
// 简写形式,默认是大顶堆
priority_queue<int> pque;
// 全写形式,大顶堆
priority_queue<int,vector<int>,less<int>> maxque;
// 全写形式,小顶堆
priority_queue<int, vector<int>, greater<int>> minque;
pque.emplace(4);
pque.emplace(9);
pque.emplace(3);
pque.emplace(5);
pque.emplace(7);
int n = pque.size();
// 可以看到这里每一步pop,优先队列都自动实现了堆的调整
// 使得每次队列中的序列元素都满足一个大顶堆
for (int i = 0; i < n; i++) {
cout << pque.top();
pque.pop();
}
// 输出:97543
// 因为每次都保证了队首元素是最大值(大顶堆堆顶),所以输出是有序的
// 感觉最大的意义就是不用自己写堆了,但是可能面试官不会让你这么干
// 笔试的意义大一些
return 0;
}

但是尽管优先队列免去了自己写、操作细节,但调整堆的时间&空间复杂度仍然是有的

本文作者:YaosGHC

本文链接:https://www.cnblogs.com/yaocy/p/16924442.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   YaosGHC  阅读(34)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起