• 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相关推荐

  1. STL 源码剖析 heap堆

    heap不属于STL容器的组件,属于幕后角色,是priority_queue的助手 priority_queue 允许用户以任何次序将任何元素推入容器内,但是取出的时候需要从优先级最高(也就是数值最高 ...

  2. C++ STL源码剖析 笔记

    写在前面 记录一下<C++ STL源码剖析>中的要点. 一.STL六大组件 容器(container): 各种数据结构,用于存放数据: class template 类泛型: 如vecto ...

  3. STL源码剖析学习七:stack和queue

    STL源码剖析学习七:stack和queue stack是一种先进后出的数据结构,只有一个出口. 允许新增.删除.获取最顶端的元素,没有任何办法可以存取其他元素,不允许有遍历行为. 缺省情况下用deq ...

  4. 《STL源码剖析》学习-- 1.9-- 可能令你困惑的C++语法1

    最近在看侯捷的<STL源码剖析>,虽然感觉自己c++看得比较深一点,还是感觉还多东西不是那么明白,这里将一些细小的东西或者概念记录一下. 有些东西是根据<C++编程思想>理解的 ...

  5. 《STL源码剖析》学习--6章--_rotate算法分析

     最近在看侯捷的<STL源码剖析>,其中有许多不太明白之处,后经分析或查找资料有了些理解,现记录一下. <STL源码剖析>学习--6章--random access ite ...

  6. 《STL源码剖析》学习--6章--power算法分析

    最近在看侯捷的<STL源码剖析>,其中有许多不太明白之处,后经分析或查找资料有了些理解,现记录一下. 6章--power算法分析 书本中的算法如下所示: template <clas ...

  7. STL源码剖析——P142关于list::sort函数

    在list容器中,由于容器自身组织数据的特殊性,所以list提供了自己的排序函数list::sort, 并且实现得相当巧妙,不过<STL源码剖析>的原文中,我有些许疑问,对于该排序算法,侯 ...

  8. STL源码剖析---红黑树原理详解下

    转载请标明出处,原文地址:http://blog.csdn.net/hackbuteer1/article/details/7760584       算法导论书上给出的红黑树的性质如下,跟STL源码 ...

  9. STL源码剖析面试问题

    当vector的内存用完了,它是如何动态扩展内存的?它是怎么释放内存的?用clear可以释放掉内存吗?是不是线程安全的? vector内存用完了,会以当前size大小重新申请2* size的内存,然后 ...

最新文章

  1. 2020-11-02C 标准库 - <ctype.h>
  2. Centos6.5子域名绑定子目录
  3. 阿里云边缘计算又获奖啦!
  4. 前端学习(2829):block标签的使用
  5. 李洋疯狂C语言之求素数的方法
  6. shell信息查看脚本linux,每次登录Shell时使用shell脚本查看Linux上的系统信息
  7. linux开启多少到多少端口命令,Linux端口命令
  8. 2015 UESTC 数据结构专题N题 秋实大哥搞算数 表达式求值/栈
  9. 分享一个导出数据到 Excel 的类库
  10. 中英文国家名及手机号码前缀
  11. 软件工程(需求分析)
  12. APP支付宝登录第三方授权如何签约入口在哪里
  13. 各种欢喜怒笑表情符号,聊天时候用
  14. GTD时间管理法的五个步骤 用便签备忘录辅助完成高效时间管理
  15. 在命令行窗口中打开win10的显示设置
  16. 自己动手学TCP/IP--ICMP(ping报文)
  17. 怎么退出自适应巡航_解放双脚 ACC自适应巡航系统详解
  18. 对于安装破解版BurpSuite无法用java打开注册机的问题
  19. VisualSVN server 备份恢复
  20. [JS]技术交底列表

热门文章

  1. spark 用户画像挖掘分析_如何基于Spark进行用户画像?
  2. elementui获取所有树节点_element-ui tree获取子节点全选的父节点信息
  3. profile 安卓work_androidWorkProfileGeneralDeviceConfiguration 资源类型
  4. Java swing 实现下拉框和文本框同步显示
  5. 【转】ABP源码分析二十二:Navigation
  6. 计算机组成与系统原理中的节拍是什么意思?
  7. 【JS逆向百例】某音乐网分离式 webpack 非 IIFE 改写实战
  8. Windows/Android/iOS 等常见 User-Agent 大全
  9. linux查看java版本_linux 查看java版本
  10. 【LeetCode 629】K个逆序对数组