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

【STL】priority_queue 基础,应用与操作

c在C++的标准模板库(STL)中,priority_queue 是一个基于堆的容器适配器,用于实现优先级队列。它本质上是一个最大堆(Max-Heap),即每次取出元素时,始终取出优先级最高的元素。本文将详细讲解priority_queue的基础操作、特性及使用注意事项。

1. priority_queue的基本概念

priority_queue 是一个容器适配器,通常底层使用 vector 和堆(默认是最大堆)来实现。队列中元素按照优先级排序,默认情况下,优先级最高的元素会被优先弹出。这意味着,容器中第一个元素始终是值最大的。

1.1 头文件

要使用 priority_queue,必须包含头文件:

#include <queue>

1.2 基本定义

std::priority_queue<int> pq;  // 定义一个存储 int 类型的优先级队列(默认最大堆)

1.3 底层容器选择

priority_queue 可以选择不同的底层容器,常用的包括 vector 和 deque,默认情况下是使用 vector。

2. priority_queue 的基本操作

2.1 push() 插入元素

使用 push() 向队列中插入新元素。插入时,元素会根据优先级被放置到合适的位置。

pq.push(5);   // 插入元素 5
pq.push(10);  // 插入元素 10
pq.push(3);   // 插入元素 3

在插入后,priority_queue 会自动调整,使得最大元素始终位于队列顶端。

2.2 top() 获取最大元素

使用 top() 来访问队列中优先级最高的元素(即最大元素)。这个操作不会移除元素,只是返回它的值。

std::cout << pq.top();  // 输出 10

2.3 pop() 移除最大元素

使用 pop() 来移除队列中优先级最高的元素。请注意,这个操作并不返回被移除的元素,仅仅是将其从队列中删除。

pq.pop();  // 移除优先级最高的元素(10)

2.4 empty() 检查队列是否为空

使用 empty() 可以检查优先级队列是否为空,返回一个布尔值。

if (pq.empty()) 
{std::cout << "Queue is empty." << std::endl;
}

2.5 size() 返回队列的元素个数

使用 size() 可以返回当前队列中元素的个数。

std::cout << pq.size();  // 输出当前队列中元素的个数

3. 自定义比较函数(最小堆)

默认情况下,priority_queue 是一个最大堆,但可以通过自定义比较器将其变为最小堆。通过指定比较函数,可以改变元素的排列顺序。

3.1 使用 greater 实现最小堆

可以使用 std::greater 来使得 priority_queue 变为最小堆,即优先级最低的元素会优先弹出。

#include <functional>  // 引入 less 和 greaterstd::priority_queue<int, std::vector<int>, std::greater<int>> minHeap;

4. priority_queue 特性与注意事项

4.1 底层实现机制

priority_queue 的底层实现依赖于堆排序算法,因此其时间复杂度如下:

  • 插入操作 push():O(log n)
  • 获取最大元素 top():O(1)
  • 删除最大元素 pop():O(log n)

4.2 避免直接遍历

priority_queue 并不提供直接遍历所有元素的方法,原因是它的结构是基于堆的,内部顺序并不保证元素是按优先级依次排列的。因此,如果需要遍历所有元素,通常需要借助额外的容器或将元素逐个弹出。

4.3 谨慎修改元素

priority_queue 并不支持直接修改元素的优先级,一旦插入某个元素,想要调整优先级只能将该元素删除后,重新插入带有新优先级的元素。

5. 使用场景

priority_queue 适用于那些需要频繁取出优先级最高(或最低)元素的场景。常见的应用场景包括:

  • 任务调度:根据任务的优先级决定执行顺序。
  • 图算法:如Dijkstra算法和Prim算法,利用优先级队列高效处理最短路径或最小生成树。
  • 数据流处理:实时处理数据流中前 k 大或前 k 小的元素。

实例如下:

以下是一个简单的例子,演示了如何使用 priority_queue 来处理最大堆和最小堆。

#include <iostream>
#include <queue>
#include <vector>
using namespace std;int main()
{// 默认最大堆priority_queue<int> maxHeap;maxHeap.push(3);maxHeap.push(5);maxHeap.push(1);cout << "Max-Heap: ";while (!maxHeap.empty()){cout << maxHeap.top() << " ";  // 输出 5 3 1maxHeap.pop();}cout << endl;// 最小堆priority_queue<int, vector<int>, greater<int>> minHeap;minHeap.push(3);minHeap.push(5);minHeap.push(1);cout << "Min-Heap: ";while (!minHeap.empty()){cout << minHeap.top() << " ";  // 输出 1 3 5minHeap.pop();}return 0;
}

在这里插入图片描述

7. 总结

priority_queue 是C++ STL中一个强大的容器适配器,用于处理需要频繁访问优先级最高(或最低)元素的场景。 通过了解其基本操作、自定义排序规则以及底层实现机制,开发者可以更加灵活地应用它来解决各类优先级相关的问题。不过,也要注意其一些限制,如无法直接遍历和修改元素优先级。

相关文章:

【STL】priority_queue 基础,应用与操作

c在C的标准模板库&#xff08;STL&#xff09;中&#xff0c;priority_queue 是一个基于堆的容器适配器&#xff0c;用于实现优先级队列。它本质上是一个最大堆&#xff08;Max-Heap&#xff09;&#xff0c;即每次取出元素时&#xff0c;始终取出优先级最高的元素。本文将详细…...

tasklist命令的应用实例

tasklist命令的应用实例 引言 在系统管理和故障排查过程中&#xff0c;了解当前正在运行的进程信息是至关重要的。Windows操作系统提供了一个强大的命令行工具——tasklist&#xff0c;它可以帮助用户查看当前系统中所有正在运行的进程及其相关信息。掌握这个命令的使用&…...

基于协同过滤算法+PHP的新闻推荐系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于协同过滤算法PHPMySQL的新…...

196页满分PPT | 集团流程优化及IT规划项目案例

细阐述了XX集团信息化建设的总体目标、指导原则、信息架构规划、应用系统架构规划、IT基础设施架构规划以及IT管控模式设计。文档内容涵盖了从现状分析到未来三年信息化建设目标的明确&#xff0c;以及如何通过IT系统支持集团的战略升级。 背景痛点 总体信息架构规划 总体信息架…...

Android 使用高德地图实现道格拉斯 - 普克算法

道格拉斯 - 普克算法&#xff08;Douglas-Peucker algorithm&#xff09;是一种用于曲线简化的算法。 一、算法的作用 该算法的主要目的是在保持曲线形状特征的前提下&#xff0c;通过减少数据点的数量来简化曲线。这在地图绘制、图形处理、地理信息系统等领域有广泛的应用。例…...

OpenAI GPT o1技术报告阅读(2)- 关于模型安全性的测试案例

✨报告阅读&#xff1a;使用大模型来学习推理(Reason) 首先是原文链接&#xff1a;https://openai.com/index/learning-to-reason-with-llms/ 接下来我们看一个简单的关于模型安全性的测试&#xff0c;当模型被问到一个有风险的话题时&#xff0c;会如何思考并回答用户呢&…...

Stream流的思想和获取Stream流

首先介绍流的概念&#xff1a; 流可以理解为一条流水线&#xff0c;在这条流水线中有许多操作&#xff0c;比如筛选所需要的数据&#xff0c;输出打印等&#xff0c; 经过这条流水线&#xff0c;可以获取到自己所需要的数据&#xff1a; -->所以&#xff1a; Stream流的作…...

go语言中的切片详解

1.概念 在Go语言中&#xff0c;切片&#xff08;Slice&#xff09;是一种基于数组的更高级的数据结构&#xff0c;它提供了一种灵活、动态的方式来处理序列数据。切片在Go中非常常用&#xff0c;因为它们可以动态地增长和缩小&#xff0c;这使得它们比固定大小的数组更加灵活。…...

ElK 8 收集 Nginx 日志

1. 说明 elk 版本&#xff1a;8.15.0 2. 启个 nginx 有 nginx 可以直接使用。我这里是在之前环境下 docker-compose.yml 中启动了个 nginx&#xff1a; nginx:restart: alwaysimage: nginx:1.26.1ports:- "80:80"- "443:443"volumes:#- ./nginx/html:/…...

Xv6驱动(四):CLINT

阅读材料 Xv6代码&#xff1a;memlayout.h、start.c、kernelvec.S教材5.4节 CLINT内存映射 实际上&#xff0c;CLINT还包括若干个MSIP寄存器&#xff0c;用来触发软件中断&#xff0c;但是在Xv6中不考虑软件中断&#xff0c;因此这些寄存器也不用考虑 // core local interr…...

【LInux】HTTPS是如何实现安全传输的

1. 客户端发起HTTPS连接请求 当浏览器请求一个HTTPS网址时&#xff0c;客户端&#xff08;例如浏览器&#xff09;会向服务器发起一个HTTPS请求。 2. 服务器返回数字证书 服务器收到请求后&#xff0c;会向客户端发送包含公钥的数字证书。数字证书由**权威认证机构&#xff…...

英飞凌PSoC4000T的GPIO中断示例工程

关于PSoC4000T的初步介绍见:英飞凌MCU第五代高性能CAPSENSE技术PSoC4000T_psoc 4000t-CSDN博客 下面这个工程,在modustoolbox中可编译、下载到开发板、debug调试。 编译时会用到mtb_shared这个库: 已经pdl这个periperal driver library库:...

物联网(IoT)中基于深度学习的入侵检测系统的综合综述

这篇论文是一篇全面的综述&#xff0c;标题为“A comprehensive survey on deep learning-based intrusion detection systems in Internet of Things (IoT)”&#xff0c;作者是Qasem Abu Al-Haija和Ayat Droos。论文主要探讨了在物联网(IoT)环境中基于深度学习的入侵检测系统…...

《成都体育学院学报》

投稿指南 成都体育学院学报属于体育类型期刊&#xff0c;由成都体育学院主办&#xff0c;国内统一刊号&#xff1a;51-1097/G8&#xff0c;国际标准刊号&#xff1a;1001-9154&#xff0c;双月&#xff0c;面向国内外公开发行。 一、来稿必须是作者独立取得的原创性学术研究成…...

Flask-JWT-Extended登录验证, 不用自定义

"""安装:pip install Flask-JWT-Extended创建对象 初始化与app绑定jwt JWTManager(app) # 初始化JWTManager设置 Cookie 的选项:除了设置 cookie 的名称和值之外&#xff0c;你还可以指定其他的选项&#xff0c;例如&#xff1a;过期时间 (max_age)&#xff1…...

rpm 与 yum

11 rpm -qa | grep openssh rpm与 yum CentOS仅删除软件包本身而不删除依赖 https://blog.csdn.net/kangshuaibi/article/details/125472204...

几种修改docker默认存储位置的方法

需求 docker容器存放目录磁盘空间满了&#xff0c;需要转移数据&#xff0c;修改Docker默认存储位置 解决方法 方法&#xff11;&#xff1a;迁移到新目录 停止docker服务。 1systemctl stop docker; //每个liunx版本的命令不一样。创建新的docker目录&#xff0c;执行命令df…...

istio中如何使用serviceentry引入外部服务

假设需要引入一个外部服务&#xff0c;外部服务ip为10.10.102.90&#xff0c;端口为32033. 引入到istio中后&#xff0c;我想通过域名gindemo.test.ch:9090来访问这个服务。 serviceentry yaml内容如下&#xff1a; apiVersion: networking.istio.io/v1beta1 kind: ServiceEn…...

模仿抖音用户ID加密ID的算法MB4E,提高自己平台ID安全性

先看抖音的格式 对ID加密的格式 MB4EENgLILJPeQKhJht-rjcc6y0ECMk_RGTceg6JBAA 需求是 同一个ID 比如 413884936367560 每次获取得到的加密ID都是不同的&#xff0c;最终解密的ID都是413884936367560 注意这是一个加密后可解密原文的方式&#xff0c;不是单向加密 那么如下进行…...

solidwork镜像实体

效果如下&#xff1a; 可以看到这两条线是对称的。 第一步&#xff0c;点击这条要镜像的边&#xff0c;接着点击镜像实体。 然后选择镜像轴&#xff0c;即可...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了&#xff0c;就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

Qt 事件处理中 return 的深入解析

Qt 事件处理中 return 的深入解析 在 Qt 事件处理中&#xff0c;return 语句的使用是另一个关键概念&#xff0c;它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别&#xff1a;不同层级的事件处理 方…...

实战三:开发网页端界面完成黑白视频转为彩色视频

​一、需求描述 设计一个简单的视频上色应用&#xff0c;用户可以通过网页界面上传黑白视频&#xff0c;系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观&#xff0c;不需要了解技术细节。 效果图 ​二、实现思路 总体思路&#xff1a; 用户通过Gradio界面上…...

stm32wle5 lpuart DMA数据不接收

配置波特率9600时&#xff0c;需要使用外部低速晶振...

数据结构:递归的种类(Types of Recursion)

目录 尾递归&#xff08;Tail Recursion&#xff09; 什么是 Loop&#xff08;循环&#xff09;&#xff1f; 复杂度分析 头递归&#xff08;Head Recursion&#xff09; 树形递归&#xff08;Tree Recursion&#xff09; 线性递归&#xff08;Linear Recursion&#xff09;…...

spring Security对RBAC及其ABAC的支持使用

RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型&#xff0c;它将权限分配给角色&#xff0c;再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...