STL源码剖析 priority_queue
- priority_queue是一个拥有权重概念的queue,允许底部加入新的元素,头部删除旧的元素,以及审视元素数值的操作
- priority_queue带有权重的概念,即元素按照权重进行排列,而不是按照插入队列的顺序进行排序。要求权值高者在前
- 缺省情况下,priority_queue使用max_heap完成,而max_heap物理层面是基于vector逻辑层面表现像complate binary tree;max_tree用于实现priority_queue的按照权值高低自动递增排序的特性
priority_queue定义完整列表
- priority_queue底层使用vector,在加上堆的处理规则
- priority_queue不被归纳为容器 而是容器适配器
#include <iostream>
#include <vector>#ifdef __STL_USE_EXCEPTIONS
#define __STL_TRY try
#define __STL_UNWIND(action) catch(...) { action; throw; }
#else
#define __STL_TRY
#define __STL_UNWIND(action)
#endiftemplate <class T,class Sequence = std::vector<T>,class Compare = std::less<typename Sequence::value_type>>
class priority_queue{
public:typedef typename Sequence::valuetype value_type;typedef typename Sequence::size_type size_type;typedef typename Sequence::reference reference;typedef typename Sequence::const_reference const_reference;
protected:Sequence c; //底层容器Compare comp; //元素大小的比较标准
public:priority_queue() : c (){}explicit priority_queue(const Compare& x) : c() ,comp(x){}//以下使用的make_heap()、push_heap()、pop_heap()都是泛型算法//注意 任意一个构造函数都立刻在底层容器内产生一个implicit representation heap//指代比较器template<class InputIterator>priority_queue(InputIterator first, InputIterator last,const Compare& x):c(first,last),comp(x){std::make_heap(c.begin(),c.end(),comp);}//没有指代比较器template<class InputIterator>priority_queue(InputIterator first, InputIterator last):c(first,last){std::make_heap(c.begin(),c.end(),comp);}bool empty()const{return c.empty();}size_type size() const{return c.size();}const_reference top()const{return c.front();}void push(const value_type& x){__STL_TRY{//push_heap 是泛型算法,先利用底层的push_back()将新的元素推入末端,再重新排列heapc.push_back(x);//push_heap 是泛型算法std::push_heap(c.begin(),c.end(),comp);}__STL_UNWIND(c.clear());}void pop(){__STL_TRY{//pop_heap是泛型算法,从heap中取出一个元素,并不是整整将这个元素弹出,而是重排heap//需要使用底层vector的pop_back()取得被弹出的元素std::pop_heap(c.begin(),c.end(),comp);c.pop_back();}__STL_UNWIND(c.clear());}};
priority_queue没有迭代器
- priority_queue的所有元素进出是有规则限制的,只有queue的顶端元素(权值最高者)才可以被外界使用
- priority_queue不提供遍历的功能,因此无迭代器
测试用例
#include <iostream>
#include <vector>#ifdef __STL_USE_EXCEPTIONS
#define __STL_TRY try
#define __STL_UNWIND(action) catch(...) { action; throw; }
#else
#define __STL_TRY
#define __STL_UNWIND(action)
#endiftemplate <class T,class Sequence = std::vector<T>,class Compare = std::less<typename Sequence::value_type>>
class priority_queue{
public:typedef typename Sequence::value_type value_type;typedef typename Sequence::size_type size_type;typedef typename Sequence::reference reference;typedef typename Sequence::const_reference const_reference;
protected:Sequence c; //底层容器Compare comp; //元素大小的比较标准
public:priority_queue() : c (){}explicit priority_queue(const Compare& x) : c() ,comp(x){}//以下使用的make_heap()、push_heap()、pop_heap()都是泛型算法//注意 任意一个构造函数都立刻在底层容器内产生一个implicit representation heap//指代比较器template<class InputIterator>priority_queue(InputIterator first, InputIterator last,const Compare& x):c(first,last),comp(x){std::make_heap(c.begin(),c.end(),comp);}//没有指代比较器template<class InputIterator>priority_queue(InputIterator first, InputIterator last):c(first,last){std::make_heap(c.begin(),c.end(),comp);}bool empty()const{return c.empty();}size_type size() const{return c.size();}const_reference top()const{return c.front();}void push(const value_type& x){__STL_TRY{//push_heap 是泛型算法,先利用底层的push_back()将新的元素推入末端,再重新排列heapc.push_back(x);//push_heap 是泛型算法std::push_heap(c.begin(),c.end(),comp);}__STL_UNWIND(c.clear());}void pop(){__STL_TRY{//pop_heap是泛型算法,从heap中取出一个元素,并不是整整将这个元素弹出,而是重排heap//需要使用底层vector的pop_back()取得被弹出的元素std::pop_heap(c.begin(),c.end(),comp);c.pop_back();}__STL_UNWIND(c.clear());}
};int main(){int ia[9] = {0,1,2,3,4,8,9,3,5};priority_queue<int>iqp(ia,ia+9);std::cout << iqp.size() << std::endl; //9for (int i = 0; i < iqp.size(); ++i) {std::cout << iqp.top() << ' '; //9 9 9 9 9 9 9 9 9}std::cout << std::endl;while(!iqp.empty()){std::cout << iqp.top() << ' '; //9 8 5 4 3 3 2 1 0iqp.pop();}std::cout << std::endl;
}
参考链接
- __STL_TRY和__STL_UNWIND这两个宏的意思 - Superpig0501 - 博客园
STL源码剖析 priority_queue相关推荐
- STL 源码剖析 heap堆
heap不属于STL容器的组件,属于幕后角色,是priority_queue的助手 priority_queue 允许用户以任何次序将任何元素推入容器内,但是取出的时候需要从优先级最高(也就是数值最高 ...
- C++ STL源码剖析 笔记
写在前面 记录一下<C++ STL源码剖析>中的要点. 一.STL六大组件 容器(container): 各种数据结构,用于存放数据: class template 类泛型: 如vecto ...
- STL源码剖析学习七:stack和queue
STL源码剖析学习七:stack和queue stack是一种先进后出的数据结构,只有一个出口. 允许新增.删除.获取最顶端的元素,没有任何办法可以存取其他元素,不允许有遍历行为. 缺省情况下用deq ...
- 《STL源码剖析》学习-- 1.9-- 可能令你困惑的C++语法1
最近在看侯捷的<STL源码剖析>,虽然感觉自己c++看得比较深一点,还是感觉还多东西不是那么明白,这里将一些细小的东西或者概念记录一下. 有些东西是根据<C++编程思想>理解的 ...
- 《STL源码剖析》学习--6章--_rotate算法分析
最近在看侯捷的<STL源码剖析>,其中有许多不太明白之处,后经分析或查找资料有了些理解,现记录一下. <STL源码剖析>学习--6章--random access ite ...
- 《STL源码剖析》学习--6章--power算法分析
最近在看侯捷的<STL源码剖析>,其中有许多不太明白之处,后经分析或查找资料有了些理解,现记录一下. 6章--power算法分析 书本中的算法如下所示: template <clas ...
- STL源码剖析——P142关于list::sort函数
在list容器中,由于容器自身组织数据的特殊性,所以list提供了自己的排序函数list::sort, 并且实现得相当巧妙,不过<STL源码剖析>的原文中,我有些许疑问,对于该排序算法,侯 ...
- STL源码剖析---红黑树原理详解下
转载请标明出处,原文地址:http://blog.csdn.net/hackbuteer1/article/details/7760584 算法导论书上给出的红黑树的性质如下,跟STL源码 ...
- STL源码剖析面试问题
当vector的内存用完了,它是如何动态扩展内存的?它是怎么释放内存的?用clear可以释放掉内存吗?是不是线程安全的? vector内存用完了,会以当前size大小重新申请2* size的内存,然后 ...
最新文章
- 2020-11-02C 标准库 - <ctype.h>
- Centos6.5子域名绑定子目录
- 阿里云边缘计算又获奖啦!
- 前端学习(2829):block标签的使用
- 李洋疯狂C语言之求素数的方法
- shell信息查看脚本linux,每次登录Shell时使用shell脚本查看Linux上的系统信息
- linux开启多少到多少端口命令,Linux端口命令
- 2015 UESTC 数据结构专题N题 秋实大哥搞算数 表达式求值/栈
- 分享一个导出数据到 Excel 的类库
- 中英文国家名及手机号码前缀
- 软件工程(需求分析)
- APP支付宝登录第三方授权如何签约入口在哪里
- 各种欢喜怒笑表情符号,聊天时候用
- GTD时间管理法的五个步骤 用便签备忘录辅助完成高效时间管理
- 在命令行窗口中打开win10的显示设置
- 自己动手学TCP/IP--ICMP(ping报文)
- 怎么退出自适应巡航_解放双脚 ACC自适应巡航系统详解
- 对于安装破解版BurpSuite无法用java打开注册机的问题
- VisualSVN server 备份恢复
- [JS]技术交底列表
热门文章
- spark 用户画像挖掘分析_如何基于Spark进行用户画像?
- elementui获取所有树节点_element-ui tree获取子节点全选的父节点信息
- profile 安卓work_androidWorkProfileGeneralDeviceConfiguration 资源类型
- Java swing 实现下拉框和文本框同步显示
- 【转】ABP源码分析二十二:Navigation
- 计算机组成与系统原理中的节拍是什么意思?
- 【JS逆向百例】某音乐网分离式 webpack 非 IIFE 改写实战
- Windows/Android/iOS 等常见 User-Agent 大全
- linux查看java版本_linux 查看java版本
- 【LeetCode 629】K个逆序对数组