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

  1. C++<优先队列>详解,一次吃透

    目录 一.相关定义 二.priority_queue 基本操作: 头文件: 声明方式: 1.普通方法: 2.自定义优先级: 3.结构体声明方式: 一.相关定义 普通的队列具有先进先出的特性,元素追加在 ...

  2. golang 排序_堆 堆排序 优先队列 图文详解(Golang实现)

    引入 在实际应用中,我们经常需要从一组对象中查找 最大值 或 最小值 .当然我们可以每次都先排序,然后再进行查找,但是这种做法效率很低.哪么有没有一种特殊的数据结构,可以高效率的实现我们的需求呢,答案 ...

  3. java优先队列 PriorityQueue详解(附图)

    文章目录 前言 一.概念及应用场景 二.原理及源码分析 1. 了解继承图 2. 优先队列的插入 总结 前言 最近接触到优先队列的题目,正好趁这个机会复习一下优先队列,并深入了解一下源码. 一.概念及应 ...

  4. 优先队列——PriorityQueue详解

    优先队列 PriorityQueue(优先队列) 采用的是堆排序, 实际上是一个堆(不指定Comparator时默认为最小堆) 队列既可以根据元素的自然顺序来排序,也可以根据 Comparator来设 ...

  5. python优先队列_python 多线程优先队列Queue详解

    Queue模块允许创建指定长度的队列. 下面是Queue模块的常用方法: get():删除并返回队列中的一个项目 put(): 添加项目到队列 qsize() : 返回队列中元素的个数 empty() ...

  6. 优先队列priority_queue 用法详解

    优先队列priority_queue 用法详解 优先队列是队列的一种,不过它可以按照自定义的一种方式(数据的优先级)来对队列中的数据进行动态的排序 每次的push和pop操作,队列都会动态的调整,以达 ...

  7. 【数据结构】堆,大根堆,小根堆,优先队列 详解

    目录 堆 1.堆的数组实现 2.小根堆 3.大根堆 4.优先队列 例题 1.SP348 EXPEDI - Expedition(有趣的贪心思路,优先队列) 2.合并果子 堆 要了解堆之前,请先了解树, ...

  8. 详解优先级队列priority_queue(应用+模拟实现)

    优先级队列的概念 优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的 此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元 素 ...

  9. priority_queue的常见用法详解

    目录 前言 priorithy_queue的定义 priority_queue容器内元素的访问 priority_queue常用函数 priority_queue内元素优先级的设置 priority_ ...

最新文章

  1. 在VirtualBox 5.0.12 for Linux版本上安装CentOS 6.6 x86_64系统
  2. DFS:深入优先搜索 POJ-2386 Lake Counting
  3. 合并多个excel——贼快
  4. 交换机背板带宽公式计算
  5. python开发的软件有哪些-有哪些值得推荐的 Python 开发工具?
  6. 阿里云管理Android项目,Android-Sophix
  7. codeforces 1030A-C语言解题报告
  8. Linux 常用的 命令,移动,创建,删除等
  9. 49. PHP 页面静态化(2)
  10. 官网下载 CentOs 7 镜像的详细步骤
  11. 补充netty权威指南学习自定义协议实现,与springboot集成
  12. 洛谷OJ - P2440 - 木材加工(二分答案)
  13. 微型计算机鸡兔同笼,《鸡兔同笼》问题研究
  14. es 精确查找思路以及实现过程
  15. note2刷 android 5.0.2,三星Galaxy Note Pro 12.2 Android 5.0.2更新锁定了竞争对手的键盘
  16. MATLAB教程二:MATLAB矩阵处理
  17. 实习周记(第三周):忙碌
  18. vue路由跳转不执行mounted方法
  19. Kubernetes集群中部署Node节点
  20. GO语言基础之占位符

热门文章

  1. 通过实例讲解java接口和抽象类的特殊实现方法
  2. Python数组类型——列表(list)
  3. Linux用户对System76的Darter Pro笔记本电脑的评论
  4. opensource项目_一月份的Opensource.com预览
  5. devops 开源_没有开源,就不会有DevOps
  6. batchsize一定是2的幂_学习率和batchsize如何影响模型的性能?
  7. android 呼吸灯权限_小米新机搭载炫彩呼吸灯酷到爆;三星顶级旗舰Note 10正式官宣...
  8. 配置环境_python虚拟环境的搭建
  9. 草丛三剑客之逆向生成
  10. 每天一点点之vue框架开发 - History 模式下线上路由报404错误