C++优先队列priority_queue详解
priority_queue也是在写算法中很厉害且常用的一种数据结构
看着有点复杂,使用的时候视觉效果也是真的复杂 QAQ
普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。
在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出 的行为特征。
一、前言
既然是队列那么先要包含头文件
#include <queue>
, 他和queue
不同的就在于我们可以自定义其中数据的优先级, 让优先级高的排在队列前面,优先出队优先队列具有队列的所有特性,包括基本操作,只是在这基础上添加了内部的一个排序,它本质是一个堆实现的
二、常用方法
和队列基本操作相同:
- top 访问队头元素
- empty 队列是否为空
- size 返回队列内元素个数
- push 插入元素到队尾 (并排序)
- emplace 原地构造一个元素并插入队列
- pop 弹出队头元素
- swap 交换内容
三、使用方式
定义:priority_queue<Type, Container, Functional>
Type 就是数据类型Container 就是容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是vector)
Functional 就是比较的方式,当需要用自定义的数据类型时才需要传入这三个参数,使用基本数据类型时,只需要传入数据类型,默认是大顶堆
一般定义是:
//升序队列 priority_queue <int,vector<int>,greater<int> > q; //降序队列 priority_queue <int,vector<int>,less<int> >q;//greater和less是std实现的两个仿函数(就是使一个类的使用看上去像一个函数。 //其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了)
1.基本类型例子:
#include<iostream> #include <queue> using namespace std; int main() {//对于基础类型 默认是大顶堆priority_queue<int> a; //等同于 priority_queue<int, vector<int>, less<int> > a;priority_queue<int, vector<int>, greater<int> > c; //这样就是小顶堆priority_queue<string> b;for (int i = 0; i < 5; i++) {a.push(i);c.push(i);}while (!a.empty()) {cout << a.top() << ' ';a.pop();} cout << endl;while (!c.empty()) {cout << c.top() << ' ';c.pop();}cout << endl;b.push("abc");b.push("abcd");b.push("cbd");while (!b.empty()) {cout << b.top() << ' ';b.pop();} cout << endl;return 0; }
输出
4 3 2 1 0 0 1 2 3 4 cbd abcd abc
2.pari的比较
先比较第一个元素,第一个相等比较第二个
#include <iostream> #include <queue> #include <vector> using namespace std; int main() {priority_queue<pair<int, int> > a;pair<int, int> b(1, 2);pair<int, int> c(1, 3);pair<int, int> d(2, 5);a.push(d);a.push(c);a.push(b);while (!a.empty()) {cout << a.top().first << ' ' << a.top().second << '\n';a.pop();} }
输出
2 5 1 3 1 2
3.对于自定义类型
#include <iostream> #include <queue> using namespace std;//方法1 struct tmp1 //运算符重载< {int x;tmp1(int a) {x = a;}bool operator<(const tmp1& a) const{return x < a.x; //大顶堆} };//方法2 struct tmp2 //重写仿函数 {bool operator() (tmp1 a, tmp1 b) {return a.x < b.x; //大顶堆} };int main() {tmp1 a(1);tmp1 b(2);tmp1 c(3);priority_queue<tmp1> d;d.push(b);d.push(c);d.push(a);while (!d.empty()) {cout << d.top().x << '\n';d.pop();}cout << endl;priority_queue<tmp1, vector<tmp1>, tmp2> f;f.push(c);f.push(b);f.push(a);while (!f.empty()) {cout << f.top().x << '\n';f.pop();} }
输出
3 2 13 2 1
如果你觉得这篇文章对你有帮助,不妨一键三连支持一下噢~~~
C++优先队列priority_queue详解相关推荐
- C++<优先队列>详解,一次吃透
目录 一.相关定义 二.priority_queue 基本操作: 头文件: 声明方式: 1.普通方法: 2.自定义优先级: 3.结构体声明方式: 一.相关定义 普通的队列具有先进先出的特性,元素追加在 ...
- golang 排序_堆 堆排序 优先队列 图文详解(Golang实现)
引入 在实际应用中,我们经常需要从一组对象中查找 最大值 或 最小值 .当然我们可以每次都先排序,然后再进行查找,但是这种做法效率很低.哪么有没有一种特殊的数据结构,可以高效率的实现我们的需求呢,答案 ...
- java优先队列 PriorityQueue详解(附图)
文章目录 前言 一.概念及应用场景 二.原理及源码分析 1. 了解继承图 2. 优先队列的插入 总结 前言 最近接触到优先队列的题目,正好趁这个机会复习一下优先队列,并深入了解一下源码. 一.概念及应 ...
- 优先队列——PriorityQueue详解
优先队列 PriorityQueue(优先队列) 采用的是堆排序, 实际上是一个堆(不指定Comparator时默认为最小堆) 队列既可以根据元素的自然顺序来排序,也可以根据 Comparator来设 ...
- python优先队列_python 多线程优先队列Queue详解
Queue模块允许创建指定长度的队列. 下面是Queue模块的常用方法: get():删除并返回队列中的一个项目 put(): 添加项目到队列 qsize() : 返回队列中元素的个数 empty() ...
- 优先队列priority_queue 用法详解
优先队列priority_queue 用法详解 优先队列是队列的一种,不过它可以按照自定义的一种方式(数据的优先级)来对队列中的数据进行动态的排序 每次的push和pop操作,队列都会动态的调整,以达 ...
- 【数据结构】堆,大根堆,小根堆,优先队列 详解
目录 堆 1.堆的数组实现 2.小根堆 3.大根堆 4.优先队列 例题 1.SP348 EXPEDI - Expedition(有趣的贪心思路,优先队列) 2.合并果子 堆 要了解堆之前,请先了解树, ...
- 详解优先级队列priority_queue(应用+模拟实现)
优先级队列的概念 优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的 此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元 素 ...
- priority_queue的常见用法详解
目录 前言 priorithy_queue的定义 priority_queue容器内元素的访问 priority_queue常用函数 priority_queue内元素优先级的设置 priority_ ...
最新文章
- 在VirtualBox 5.0.12 for Linux版本上安装CentOS 6.6 x86_64系统
- DFS:深入优先搜索 POJ-2386 Lake Counting
- 合并多个excel——贼快
- 交换机背板带宽公式计算
- python开发的软件有哪些-有哪些值得推荐的 Python 开发工具?
- 阿里云管理Android项目,Android-Sophix
- codeforces 1030A-C语言解题报告
- Linux 常用的 命令,移动,创建,删除等
- 49. PHP 页面静态化(2)
- 官网下载 CentOs 7 镜像的详细步骤
- 补充netty权威指南学习自定义协议实现,与springboot集成
- 洛谷OJ - P2440 - 木材加工(二分答案)
- 微型计算机鸡兔同笼,《鸡兔同笼》问题研究
- es 精确查找思路以及实现过程
- note2刷 android 5.0.2,三星Galaxy Note Pro 12.2 Android 5.0.2更新锁定了竞争对手的键盘
- MATLAB教程二:MATLAB矩阵处理
- 实习周记(第三周):忙碌
- vue路由跳转不执行mounted方法
- Kubernetes集群中部署Node节点
- GO语言基础之占位符
热门文章
- 通过实例讲解java接口和抽象类的特殊实现方法
- Python数组类型——列表(list)
- Linux用户对System76的Darter Pro笔记本电脑的评论
- opensource项目_一月份的Opensource.com预览
- devops 开源_没有开源,就不会有DevOps
- batchsize一定是2的幂_学习率和batchsize如何影响模型的性能?
- android 呼吸灯权限_小米新机搭载炫彩呼吸灯酷到爆;三星顶级旗舰Note 10正式官宣...
- 配置环境_python虚拟环境的搭建
- 草丛三剑客之逆向生成
- 每天一点点之vue框架开发 - History 模式下线上路由报404错误