C++ STL 优先队列 (priority_queue)
std::priority_queue
<queue>
优先队列
优先队列是一种容器适配器,根据某些严格的弱排序标准,使其第一个元素始终包含的最大元素。
这种特性类似于堆,它可以在其中随时插入元素,并且只能检索最大堆元素(即优先级队列顶部的元素)。
优先队列内部的实现需要依赖基础容器
,该容器应可通过随机访问[i]
和迭代器Iterator
访问,并需要支持以下操作
empty( )
size( )
front( )
push_back( )
pop_back( )
显而易见的是有deque
和vector
这两个基础容器支持以上操作
所以在默认情况下,如果未为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 的所有元素
构造优先队列
<queue>
/* 1 */ priority_queue<int> pq1; //默认大根堆且默认基础容器为vector
/* 2 */ priority_queue<vector<int>, less<int> > pq2; //与 1 的性质一模一样
/* 3 */ priority_queue<deque<int>, greater<int> > pq3; //小根堆且基础容器为deque
注意:大根堆为
less
,小根堆为greater
。
函数成员用例
1、push、top、empty、、pop、大根堆
(1)int
#include <iostream>
#include <queue>
using namespace std;
int main ( void )
{
priority_queue<int> pq; //大根堆,默认降序(大的在前,小的在后)
pq.push ( 60 );
pq.push ( 20 );
pq.push ( 40 );
pq.push ( 1 );
pq.push ( 25 );
while ( !pq.empty() ) // pq不为空则循环
{
cout << pq.top() << " "; //添加新元素
pq.pop(); //弹出头元素
}
return 0;
}
(2)string
#include <iostream>
#include <queue>
using namespace std;
int main ( void )
{
priority_queue<string> pq; //大根堆,默认降序(大的在前,小的在后)
pq.push ( "abc" );
pq.push ( "abd" );
pq.push ( "acd" );
pq.push ( "cda" );
pq.push ( "abcd" );
while ( !pq.empty() ) // pq不为空则循环
{
cout << pq.top() << endl; //添加新元素
pq.pop(); //弹出头元素
}
return 0;
}
输出按字典序
2、swap、emplace、小根堆
#include <iostream>
#include <queue>
using namespace std;
int main ( void )
{
priority_queue<int, vector<int>, greater<int> > pq1; //小根堆,默认降序(小的在前,大的在后)
pq1.emplace ( 5 );
pq1.emplace ( 4 );
pq1.emplace ( 3 );
pq1.emplace ( 2 );
pq1.emplace ( 1 );
priority_queue<int, vector<int>, greater<int> > pq2;
pq2.emplace ( 5 * 2 );
pq2.emplace ( 4 * 2 );
pq2.emplace ( 3 * 2 );
pq2.emplace ( 2 * 2 );
pq2.emplace ( 1 * 2 );
cout << "pq1:" << endl;
while ( !pq1.empty() ) // pq不为空则循环
{
cout << pq1.top() << " "; //添加新元素
pq1.pop(); //弹出头元素
}
cout << endl << "pq2:" << endl;
while ( !pq2.empty() ) // pq不为空则循环
{
cout << pq2.top() << " "; //添加新元素
pq2.pop(); //弹出头元素
}
cout << endl;
return 0;
}
C++ STL 优先队列 (priority_queue)的更多相关文章
- C++ STL 优先队列 priority_queue 详解(转)
转自https://blog.csdn.net/c20182030/article/details/70757660,感谢大佬. 优先队列 引入 优先队列是一种特殊的队列,在学习堆排序的时候就有所了解 ...
- 【C++ STL 优先队列priority_queue】
https://www.cnblogs.com/fzuljz/p/6171963.html
- 【STL】优先队列priority_queue详解+OpenJudge-4980拯救行动
一.关于优先队列 队列(queue)这种东西广大OIer应该都不陌生,或者说,队列都不会你还学个卵啊(╯‵□′)╯︵┻━┻咳咳,通俗讲,队列是一种只允许从前端(队头)删除元素.从后端(队尾)插入元素的 ...
- 浅谈C++ STL中的优先队列(priority_queue)
从我以前的博文能看出来,我是一个队列爱好者,很多并不是一定需要用队列实现的算法我也会采用队列实现,主要是由于队列和人的直觉思维的一致性导致的. 今天讲一讲优先队列(priority_queue),实际 ...
- STL之priority_queue(优先队列)
priority_queue是一个容器适配器,在这个容器里第一个数据元素是最大的.它的使用场景是什么样:如果12306抢票,为什么黄牛能抢这么多票,感觉12306那边的请求队列是一个优先队列,黄牛的请 ...
- CJOJ 2484 函数最小值 / Luogu 2085 函数最小值(STL优先队列,堆)
CJOJ 2484 函数最小值 / Luogu 2085 函数最小值(STL优先队列,堆) Description 有n个函数,分别为F1,F2,...,Fn.定义 \(Fi(x)=Aix^2+Bix ...
- CJOJ 2482 【POI2000】促销活动(STL优先队列,大根堆,小根堆)
CJOJ 2482 [POI2000]促销活动(STL优先队列,大根堆,小根堆) Description 促销活动遵守以下规则: 一个消费者 -- 想参加促销活动的消费者,在账单下记下他自己所付的费用 ...
- 基于STL优先队列和邻接表的dijkstra算法
首先说下STL优先队列的局限性,那就是只提供入队.出队.取得队首元素的值的功能,而dijkstra算法的堆优化需要能够随机访问队列中某个节点(来更新源点节点的最短距离). 看似可以用vector配合m ...
- poj 3253 Fence Repair (STL优先队列)
版权声明:本文为博主原创文章,未经博主同意不得转载. vasttian https://blog.csdn.net/u012860063/article/details/34805369 转载请注明出 ...
随机推荐
- 线程池的介绍和使用,以及基于jvmti设计非入侵监控
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 五常大米好吃! 哈哈哈,是不你总买五常大米,其实五常和榆树是挨着的,榆树大米也好吃, ...
- 题解洛谷P1538【迎春舞会之数字舞蹈】
方法:暴力,判断,输出 本题为了更好理解建议各位可以复制样例来研究,甚至可以复制题解来测试思想,相信大家不会抄. 有什么不好的请大佬们在评论里指出,谢谢 #include <bits/stdc+ ...
- 图解 IP 基础知识!
我把自己以往的文章汇总成为了 Github ,欢迎各位大佬 star https://github.com/crisxuan/bestJavaer IP 协议 路由器对分组进行转发后,就会把数据包传到 ...
- Python循环语句代码详解:while、for、break
1 while循环 循环语句是程序设计中常用的语句之一.任何编程语言都有while循环,Python也不例外.while循环的格式如下所示. while(表达式): - else: ...
- mysql中order by优化的那些事儿
为了测试方便和直观,我们需要先创建一张测试表并插入一些数据: CREATE TABLE `shop` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '记 ...
- Socket.io详解
socket.io是一个跨浏览器支持WebSocket的实时通讯的JS. http://socket.io/docs/ 由于HTTP是无状态的协议,要实现即时通讯非常困难.因为当对方发送一条消息时,服 ...
- 记一次MAVEN依赖事故
笔者昨天遇到的背景是这样的 MAVEN A模块有一个子模块 需要依赖B模块下的一个子模块 我在B项目内通过mvn deploy上传子模块 但之后在A模块引用 怎么引用都不行 提示 org.a ...
- python安装库报错的处理方法
在安装python map库时遇到了还多问题,找了好的方法都没有安装成功,最后改安装basemap库参考了了:https://www.jb51.net/article/147780.htm一文操作,最 ...
- 第13章节 BJROBOT 雷达跟随【ROS全开源阿克曼转向智能网联无人驾驶车】
雷达跟随说明:注意深度摄像头的 USB 延长线,可能会对雷达扫描造成影响, 所以在雷达跟随前,把深度摄像头的 USB 延长线取下.另外雷达跟随范围大概是前方 50cm 和 120°内扫描到的物体都可以 ...
- AI驱动的超分辨技术落地实践
近年来,随着深度学习技术的快速发展,基于AI的超分辨技术在图像恢复和图像增强领域呈现出广阔的应用前景,受到了学术界和工业界的关注和重视.但是,在RTC视频领域中,很多AI算法并不能满足实际场景下的应用 ...