STL——理解priority_queue
文章目录
- 1、priority_queue基本介绍
- 2、priority_queue的常用接口及其使用
- 3、priority_queue模拟实现
- 3.1 仿函数Less和Great
- 3.2 adjust_up和adjust_down
- 3.3 priority_queue的定义
1、priority_queue基本介绍
- 优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。
- 此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元素)。
- 优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从特定容器的“尾部”弹出,其称为优先队列的顶部。
- 底层容器可以是任何标准容器类模板,也可以是其他特定设计的容器类。容器应该可以通过随机访问迭代器访问。
- 标准容器类vector和deque满足这些需求。默认情况下,如果没有为特定priority_queue类实例化指定容器类,则使用vector。
- 需要支持随机访问迭代器,以便始终在内部保持堆结构。容器适配器通过在需要时自动调用算法函数make_heap、push_heap和pop_heap来自动完成此操作。
2、priority_queue的常用接口及其使用
优先级队列默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中元素构造成堆的结构,因此priority_queue就是堆,所有需要用到堆的位置,都可以考虑使用priority_queue。注意:默认情况下priority_queue是大堆,数据大的优先级高
函数说明 | 功能说明 |
---|---|
priority_queue()/priority_queue(first,last) | 构造一个空的优先级队列或者通过两个迭代器区间的数据构造优先级队列 |
empty( ) | 检测优先级队列是否为空,是返回true,否则返回false |
top( ) | 返回优先级队列中最大(最小元素),即堆顶元素 |
push(val) | 在优先级队列中插入元素val |
pop() | 删除优先级队列中最大(最小)元素,即堆顶元素 |
点击查看文档中priority_queue的细节
3、priority_queue模拟实现
3.1 仿函数Less和Great
//通过使用仿函数来达到使用者能够轻易改变优先级
template<class T>
struct Less //大的优先级高,建大堆,升序
{bool operator()(const T& x1, const T& x2) const{return x1 < x2;}
};template<class T>
struct Greater//小的优先级高,建小堆,降序
{bool operator()(const T& x1, const T& x2) const{return x1 > x2;}
};//为什么Less和Greater实现的功能恰好相反,因为库里的也是这么实现的,所以我们也这样实现
3.2 adjust_up和adjust_down
template<class T, class Container = vector<int>, class Compare = Less<T>>
class priority_queue
{//把这两个调整算法写为私有,因为使用者不需要知道底层实现,这也很好的体现了封装性
private: void adjust_up(size_t child)//向上调整{Compare com;size_t parent = (child - 1) / 2;//从第一个非叶子结点开始调节while (child > 0)//注意:这里一定是child>0,不需要写>=,因为当child=0时,child已经是根结点了,不需要调整了{//if (_con[child] > _con[parent])if (com(_con[parent], _con[child]))//——》_con[parent] < _con[child]{swap(_con[child], _con[parent]);child = parent;parent = (child - 1) / 2;}else//不满足条件时,调整就已经结束了{break;}}}void adjust_down(size_t parent)//向下调整{Compare com;size_t child = parent * 2 + 1;//默认是左孩子小while (child < _con.size()){//if (child + 1 < _con.size() && _con[child + 1] > _con[child])if (child + 1 < _con.size() && com(_con[child], _con[child + 1]))//_con[child] < _con[child + 1]{child += 1;//如果右孩子大,就加1}//if (_con[child] > _con[parent])if (com(_con[parent], _con[child]))//_con[parent] < _con[child]{swap(_con[child], _con[parent]);parent = child;child = parent * 2 + 1;}else{break;}}}
}
如果不了解堆以及堆的调整算法,请点击——》数据结构——二叉树的顺序结构—堆
3.3 priority_queue的定义
template<class T, class Container = vector<int>/*缺省值给vector<int>*/, class Compare = Less<T>>
class priority_queue
{public:priority_queue()//如果是内置类型,或者STL都不需要写,如果是自定类型就需要写,析构函数也一样{}~priority_queue(){}template<class InputIterator>priority_queue(InputIterator first, InputIterator last):_con(first, last)//通过迭代器区间初始化{for (int i = (_con.size() - 2) / 2; i >= 0; i--){adjust_down(i);}}//如果需要使用向下调整算法建小(大)堆,就需要保证左右都是小(大)堆,//所以我们就需要从最后一个非叶子节点开始调整,直到将第一个结点也调整完为止void push(const T& x){_con.push_back(x);adjust_up(_con.size() - 1);//插入数据后,堆的结构就被破坏了,所以需要从新向上调整}void pop(){assert(!_con.empty());swap(_con[0], _con[_con.size() - 1]);//删除数据我们只需要将第一个数据和最后一个数据互换,再将size-1,就达到了删除的效果_con.pop_back();adjust_down(0);//因为第一个数据和最后一个数据互换了,堆结构已经被破坏,所以需要向下调整}//获取元素个数size_t size() const{return _con.size();}//获取优先级最高的元素const T& top(){return _con[0];}//判断priority_queue是否为空bool empty(){return _con.empty();}private:Container _con;//通过模板来构造_con
};
STL——理解priority_queue相关推荐
- [转载]STL之priority_queue
原文地址:STL之priority_queue作者:李大宝 STL之优先队列 原本以为priority_queue很简单,才知道原来懂的只是最简单的形式. 头文件:#include<queue& ...
- STL 中priority_queue小结
(1)为了运用priority_queue,你必须包含头文件<queue>:#include<queue> (2)在头文件中priority_queue定义如下: nam ...
- C++之STL之priority_queue
1.priority_queue介绍 priority_queue 是优先队列 模板声明带有三个参数,priority_queue<Type, Container, Functional> ...
- 【C++ STL】priority_queue自定义排序函数
priority_queue是C++的一种STL容器,实现为堆.在leetcode刷题中非常常用.有些时候我们需要塞入自定义的数据结构.这样就需要对其的排序方式做一个重新定义. 假设有以下数据结构 s ...
- C++STL 优先队列priority_queue使用
头文件:#include <queue> 一.申明方式 std::priority_queue<T> q; std::priority_queue<T, std::vec ...
- STL queue priority_queue
queue 队列 queue 队列 就像排队一样,后来的排在后面,先来的先出队.所以只能对队首和队尾的元素进行操作 back() 返回最后一个元素 empty() 如果队列空则返回真 front() ...
- (STL,set,priority_queue)丑数
题目: 丑数是指不能被2,3,5以外的其他素数整除的数.把丑数从小到大排列起来,结果如下:1,2,3,4,5,6,8,9,10,12,-求第1500个丑数 分析与解答: 0.对于任意丑数x:2x,3x ...
- C++ STL实现的优先队列( priority_queue )
本文参考的源码版本:gcc version 8.1.0 (x86_64-posix-seh-rev0, Built by MinGW-W64 project). priority_queue 本质是容 ...
- [转载]STL之priority_queue_彭世瑜_新浪博客
原文地址:STL之priority_queue作者:李大宝 STL之优先队列 原本以为priority_queue很简单,才知道原来懂的只是最简单的形式. 头文件:#include<queue& ...
最新文章
- int main(int argc,char *argv[]),主函数的参数问题
- python【Matlibplot绘图库】优雅的画极坐标(玫瑰)图
- SpringBoot AOP完全讲解二:统一处理请求日志
- ScrollView嵌套ListView后,进入页面不从顶部开始显示的问题解决
- pytorch 训练过程学习率设置衰减
- css垂直水平居中的整理
- 外观模式 门面模式 Facade 结构型 设计模式(十三)
- xaml 的 intellisense失效的解决办法
- 我发现了个 Python 黑魔法,执行任意代码都会自动念上一段「平安经」
- 大数据分析常见的犯错问题
- Java 基础 匿名对象
- VS错误的解决办法:error LNK2019: 无法解析的外部符号
- C++学习笔记(达内视频版)
- Java实现18位身份证号码的校验码计算校验
- 防火墙添加ip白名单_宝塔防火墙IP白名单添加/导入知道创宇云CDN节点IP段
- linux终端查找隐藏文件,如何在Linux服务器中查看或隐藏文件?
- AI玩Flappy Bird│基于DQN的机器学习实例【完结】
- JS 流行库(三):Zepto
- linux ./ 执行run文件,如何在Ubuntu中执行.bin和.run文件
- dnf剑魂buff等级上限_DNF剑魂职业定位、装备、加点、猴戏、新老换装详解
热门文章
- 好用的外汇行情分析软件,让交易不再难
- 一个仿凡客电子商务平台的沉思
- 网络规划设计师上午真题及解析(2020)
- @RequestHeader简介
- 别踩白块html源码,原生JS实现别踩白块小游戏(七)
- 如何用手机HTML制作哆啦a梦,HTML5利用canvas绘制哆啦A梦头部-电脑自学网
- 七个免费邮件服务器软件
- 【C++标准库】std::string用法指南源码剖析
- 自然语言处理(NLP)-第三方库(工具包):WordNet(在nltk.corpus下)【英文:同义词、反义词、蕴含关系、语义相似度】
- 23位子网掩码是多少_23位子网掩码ip范围