当前位置: 首页 > article >正文

C++ priority_queue

priority_queue介绍(优先级队列)

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

此上下文类似于,其中元素可以随时插入,并且只能检索最大堆元素优先级队列中位于顶部的元素)。

优先级队列作为容器适配器实现,容器适配器是使用特定容器类的封装对象作为其基础容器的类,提供一组特定的成员函数来访问其元素。元素从特定容器的 “back” 弹出,这称为优先级队列的顶部

priority_queue使用

优先级队列默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中元素构造成堆的结构,因此priority_queue就是堆,所有需要用到堆的位置,都可以考虑使用 priority_queue。注意:默认情况下priority_queue是大堆。

priority_queue()/priority_queue(first, last) 构造一个空的优先级队列

empty( ) 检测优先级队列是否为空,是返回true,否则返回false

top( ) 返回优先级队列中最大(最小元素),即堆顶元素

push(x) 在优先级队列中插入元素x

pop() 删除优先级队列中最大(最小)元素,即堆顶元素

vector<int> v{3,2,7,6,0,4,1,9,8,5};
 priority_queue<int> q1;
 for (auto& e : v)
 q1.push(e);
 cout << q1.top() << endl;

只要将数据存入优先级队列,优先级队列就能自动排序,优先级队列在默认情况下是大堆。

priority_queue<int, vector<int>, greater<int>> q2(v.begin(), v.end());
 cout << q2.top() << endl;

如果要创建小堆,将第三个模板参数换成greater比较方式。

如果在priority_queue中放自定义类型的数据,用户需要在自定义类型中提供> 或者< 的重载。

练习

数组中第k个大的数 

int findKthLargest(vector<int>& nums, int k) {
        priority_queue<int> q1;
        for(int i=0;i<nums.size();i++)
        {
            q1.push(nums[i]);
        }
        for(int i=1;i<k;i++)
        {
            q1.pop();
        }
        return q1.top();
    }

直接通过调用优先级队列在存储数组中的元素,随后pop掉数组中前k个大的数,再返回优先级队列的栈顶即可完成


http://www.kler.cn/a/301222.html

相关文章:

  • 统信UOS开发环境支持Golang
  • 【JavaEE初阶 — 多线程】定时器的应用及模拟实现
  • 基于普中51单片机开发板的电子门铃设计( proteus仿真+程序+设计报告+讲解视频)
  • mysql 的乐观锁和 mvcc 是一回事吗
  • WPF Gif图谱 如果隐藏的话会存在BUG
  • QT仿QQ聊天项目,第三节,实现聊天界面
  • 漫谈设计模式 [4]:原型模式
  • go-map系统学习
  • livox mid360不使用ros接收雷达数据
  • StreamPark集成k8s运行Flink
  • busybox移植:全能脚本版
  • 在亚马逊云科技上利用Graviton4代芯片构建高性能Java应用(下篇)
  • 3.Kubernetes资源对象之pod
  • 828华为云征文|华为云Flexus X实例docker部署最新版禅道构建属于自己的项目管理平台
  • 文心智能体应用:美国旅游助手的诞生
  • 【进展报告】9.9-9.12
  • Cargo 入门
  • 远程控制软件有哪些?不多,给你奉上这6款神仙软件
  • nodeJS学习笔记——包npm(2)
  • vue3利用ref操作dom元素
  • MySQL 的关键字
  • 高级 ECharts 技巧:自定义图表主题与样式
  • 详解Redis的AOF持久化方式以及aof日志重写配置以及对redis中的GEO地理位置数据类型命令的应用示例
  • 2023下半年软考网络规划
  • 【信号】信号的保存
  • ffmpeg面向对象-rtsp拉流相关对象