std::priority_queue

<queue>

优先队列

  优先队列是一种容器适配器,根据某些严格的弱排序标准,使其第一个元素始终包含的最大元素。

  这种特性类似于堆,它可以在其中随时插入元素,并且只能检索最大堆元素(即优先级队列顶部的元素)。

  优先队列内部的实现需要依赖基础容器,该容器应可通过随机访问[i]和迭代器Iterator访问,并需要支持以下操作

  • empty( )

  • size( )

  • front( )

  • push_back( )

  • pop_back( )

     显而易见的是有dequevector这两个基础容器支持以上操作

     所以在默认情况下,如果未为priority_queue指定基础容器类,则将使用vector

成员函数

(constructor) Construct priority queue (public member function )
empty 优先队列是否为空
size 返回优先队列的当前元素个数
top 访问顶部元素(返回顶部元素的常量引用)
push 插入一个元素
pop 删除顶部元素
emplace 构造并插入一个元素
void swap (priority_queue& x) 交换两个队列的内容

注:

1、emplace 与 push 相比更加优化了对内存空间的使用,具体可以另行查询

2、swap 是交换两个同一类型的优先队列内的所有元素,如 a.swap ( x ) 即交换队列 a 和 x 的所有元素

构造优先队列

  1. <queue>
  2. /* 1 */ priority_queue<int> pq1; //默认大根堆且默认基础容器为vector
  3. /* 2 */ priority_queue<vector<int>, less<int> > pq2; //与 1 的性质一模一样
  4. /* 3 */ priority_queue<deque<int>, greater<int> > pq3; //小根堆且基础容器为deque

注意:大根堆为less,小根堆为greater

函数成员用例

1、push、top、empty、、pop、大根堆

(1)int
  1. #include <iostream>
  2. #include <queue>
  3. using namespace std;
  4. int main ( void )
  5. {
  6. priority_queue<int> pq; //大根堆,默认降序(大的在前,小的在后)
  7. pq.push ( 60 );
  8. pq.push ( 20 );
  9. pq.push ( 40 );
  10. pq.push ( 1 );
  11. pq.push ( 25 );
  12. while ( !pq.empty() ) // pq不为空则循环
  13. {
  14. cout << pq.top() << " "; //添加新元素
  15. pq.pop(); //弹出头元素
  16. }
  17. return 0;
  18. }

(2)string
  1. #include <iostream>
  2. #include <queue>
  3. using namespace std;
  4. int main ( void )
  5. {
  6. priority_queue<string> pq; //大根堆,默认降序(大的在前,小的在后)
  7. pq.push ( "abc" );
  8. pq.push ( "abd" );
  9. pq.push ( "acd" );
  10. pq.push ( "cda" );
  11. pq.push ( "abcd" );
  12. while ( !pq.empty() ) // pq不为空则循环
  13. {
  14. cout << pq.top() << endl; //添加新元素
  15. pq.pop(); //弹出头元素
  16. }
  17. return 0;
  18. }

输出按字典序

2、swap、emplace、小根堆

  1. #include <iostream>
  2. #include <queue>
  3. using namespace std;
  4. int main ( void )
  5. {
  6. priority_queue<int, vector<int>, greater<int> > pq1; //小根堆,默认降序(小的在前,大的在后)
  7. pq1.emplace ( 5 );
  8. pq1.emplace ( 4 );
  9. pq1.emplace ( 3 );
  10. pq1.emplace ( 2 );
  11. pq1.emplace ( 1 );
  12. priority_queue<int, vector<int>, greater<int> > pq2;
  13. pq2.emplace ( 5 * 2 );
  14. pq2.emplace ( 4 * 2 );
  15. pq2.emplace ( 3 * 2 );
  16. pq2.emplace ( 2 * 2 );
  17. pq2.emplace ( 1 * 2 );
  18. cout << "pq1:" << endl;
  19. while ( !pq1.empty() ) // pq不为空则循环
  20. {
  21. cout << pq1.top() << " "; //添加新元素
  22. pq1.pop(); //弹出头元素
  23. }
  24. cout << endl << "pq2:" << endl;
  25. while ( !pq2.empty() ) // pq不为空则循环
  26. {
  27. cout << pq2.top() << " "; //添加新元素
  28. pq2.pop(); //弹出头元素
  29. }
  30. cout << endl;
  31. return 0;
  32. }

C++ STL 优先队列 (priority_queue)的更多相关文章

  1. C++ STL 优先队列 priority_queue 详解(转)

    转自https://blog.csdn.net/c20182030/article/details/70757660,感谢大佬. 优先队列 引入 优先队列是一种特殊的队列,在学习堆排序的时候就有所了解 ...

  2. 【C++ STL 优先队列priority_queue】

    https://www.cnblogs.com/fzuljz/p/6171963.html

  3. 【STL】优先队列priority_queue详解+OpenJudge-4980拯救行动

    一.关于优先队列 队列(queue)这种东西广大OIer应该都不陌生,或者说,队列都不会你还学个卵啊(╯‵□′)╯︵┻━┻咳咳,通俗讲,队列是一种只允许从前端(队头)删除元素.从后端(队尾)插入元素的 ...

  4. 浅谈C++ STL中的优先队列(priority_queue)

    从我以前的博文能看出来,我是一个队列爱好者,很多并不是一定需要用队列实现的算法我也会采用队列实现,主要是由于队列和人的直觉思维的一致性导致的. 今天讲一讲优先队列(priority_queue),实际 ...

  5. STL之priority_queue(优先队列)

    priority_queue是一个容器适配器,在这个容器里第一个数据元素是最大的.它的使用场景是什么样:如果12306抢票,为什么黄牛能抢这么多票,感觉12306那边的请求队列是一个优先队列,黄牛的请 ...

  6. CJOJ 2484 函数最小值 / Luogu 2085 函数最小值(STL优先队列,堆)

    CJOJ 2484 函数最小值 / Luogu 2085 函数最小值(STL优先队列,堆) Description 有n个函数,分别为F1,F2,...,Fn.定义 \(Fi(x)=Aix^2+Bix ...

  7. CJOJ 2482 【POI2000】促销活动(STL优先队列,大根堆,小根堆)

    CJOJ 2482 [POI2000]促销活动(STL优先队列,大根堆,小根堆) Description 促销活动遵守以下规则: 一个消费者 -- 想参加促销活动的消费者,在账单下记下他自己所付的费用 ...

  8. 基于STL优先队列和邻接表的dijkstra算法

    首先说下STL优先队列的局限性,那就是只提供入队.出队.取得队首元素的值的功能,而dijkstra算法的堆优化需要能够随机访问队列中某个节点(来更新源点节点的最短距离). 看似可以用vector配合m ...

  9. poj 3253 Fence Repair (STL优先队列)

    版权声明:本文为博主原创文章,未经博主同意不得转载. vasttian https://blog.csdn.net/u012860063/article/details/34805369 转载请注明出 ...

随机推荐

  1. 【Electron Playground 系列】文件下载篇

    作者:long.woo 文件下载是我们开发中比较常见的业务需求,比如:导出 excel. web 应用文件下载存在一些局限性,通常是让后端将响应的头信息改成 Content-Disposition: ...

  2. 登录linux时 shell执行顺序

    # .bash_history,.bash_logout,.bash_profile,.bashrc/etc/profile 全局.bash_history 记录当前登录用户历史操作的命令.bash_ ...

  3. windows 10 1909 无法启用 .NET Framework 解决

    安装某应用,运行提示: 应用程序无法正常启动(0xc0000135) 应该是缺少 .net framework. 控制面板-程序-"启用或关闭windows功能" 勾选.NET F ...

  4. html 07-HTML5举例:简单的视频播放器

    07-HTML5举例:简单的视频播放器 我们采用 Bootstrap 网站的图标字体,作为播放器的按钮图标. index.html的代码如下: <!DOCTYPE html> <ht ...

  5. 安装nodejs 版本控制器

    安装下载地址: https://pan.baidu.com/s/1Ed_IPDTOHxR9NShUEau-ZA 下载好后,放在安装nodejs的文件夹下 然后敲cmd,进入安装nodejs的文件夹下. ...

  6. 第七章 Rocketmq--消息驱动

    今天咱们接着 上一篇第六章 Sleuth–链路追踪 继续写 SpringCloud Alibaba全家桶 , 第七章 Rocketmq--消息驱动,废话不多说,开始了 7.1 MQ简介 7.1.1 什 ...

  7. php学习之sqlite查询语句之多条件查询

    一.PHP+Mysql多条件-多值查询示例代码: index.html代码:<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitio ...

  8. 简单测试linq to sql性能

         前些日子,做了一个物业收费系统,cs模式,用到了linq to sql 技术,这是我第一次使用这个东东写程序存取数据库,迷迷糊糊搞得一塌糊涂,当时有个同学他们找好的分页组件,然后写好了调用方 ...

  9. [leetcode]669. Trim a Binary Search Tree寻找范围内的二叉搜索树

    根据BST的特点,如果小于L就判断右子树,如果大于R就判断左子树 递归地建立树 public TreeNode trimBST(TreeNode root, int L, int R) { if (r ...

  10. QPushButton

    QPushButton 什么是QPushButton? 构造函数 常用属性和方法 QPushButton 什么是QPushButton? QPushButton是一个按键类. class Q_GUI_ ...