C++ priority_queue 最大堆、最小堆的实现

在C++标准库中,priority_queue 是一个容器适配器,它提供了队列的所有基本操作,包括元素的入队(push)和出队(pop),但是出队操作(top 和 pop)总是返回(并移除)优先级最高的元素。默认情况下,priority_queue 使用 std::vector 作为底层容器,并使用 std::less 作为比较对象,因此它实现了一个最大堆。

priority_queue 的典型声明如下:

std::priority_queue<T, Container, Compare> pq;
  • T 是队列中元素的类型。
  • Container 是用来存储元素的底层容器类型,默认为 std::vector<T>
  • Compare 是一个二元谓词,用于比较队列中的元素,以确定它们的优先级。默认为 std::less<T>,这意味着较大的元素具有更高的优先级。

对于最大堆,你不需要显式指定 Container 和 Compare,因为默认设置就是你想要的。但是,如果你想实现一个最小堆(即优先级最低的元素先出队),你需要提供一个不同的比较对象,如 std::greater<T>

以下是一些 priority_queue 的基本操作:

  • push(const value_type& val): 将元素添加到队列中。
  • top(): 返回队列中优先级最高的元素(但不移除它)。
  • pop(): 移除队列中优先级最高的元素。
  • empty() const: 如果队列为空,则返回 true
  • size() const: 返回队列中元素的数量。

下面是一个简单的 priority_queue 使用示例,展示了如何创建最大堆,并向其中添加元素、获取顶部元素和删除元素:

#include <iostream>  
#include <queue> // 包含priority_queue的定义  int main() {  std::priority_queue<int> pq; // 创建一个int类型的最大堆  // 向优先队列中添加元素  pq.push(3);  pq.push(1);  pq.push(4);  // 输出并删除最高优先级的元素  while (!pq.empty()) {  std::cout << pq.top() << ' '; // 输出当前最高优先级的元素  pq.pop(); // 删除最高优先级的元素  }  return 0;  
}


输出将是:

4 3 1

因为这是一个最大堆,所以数字 4(具有最高优先级)首先被输出和删除,然后是 3,最后是 1

如果你想要实现一个最小堆,你可以这样声明 priority_queue

std::priority_queue<int, std::vector<int>, std::greater<int>> pq;

现在,pq 将会按照升序排列元素,因此 top() 操作将返回最小的元素,而 pop() 操作将移除最小的元素。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/1938.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

首发!这家消金公司引入国资新股东

来源 | 镭射财经&#xff08;leishecaijing&#xff09; 「镭射财经」了解到&#xff0c;锦程消费金融已引入国资新股东成都天府软件园有限公司&#xff0c;原股东优信、浩泽净水已经退出。 成都天府软件园有限公司是成都高新投资集团旗下全资子公司&#xff0c;实际控制人为…

VBA运行后,为什么excel的三个工作表结果一样?

运行完了excel的三个工作表的结果一样&#xff0c;问题在哪呢&#xff1f; 代码如下&#xff1a; Sub 计算成绩() 计算成绩 Macro i为工作表行号 Dim i, m, total As Integer Dim w1 As Worksheet For m 1 To Worksheets.count Set w1 Worksheets(m) i 2 total 0 …

【RT-Thread应用笔记】FRDM-MCXN947上的RW007实践——WiFi延迟和带宽测试

【RT-Thread应用笔记】FRDM-MCXN947上的RW007实践——WiFi延迟和带宽测试 一、背景介绍1.1 RW007模组简介1.2 Arduino接口简介1.3 RW007软件包简介1.4 RT-Thread env工具简介 二、创建工程2.1 新建工程2.2 添加rw007软件包2.3 打开RW007配置项2.4 启用pin驱动2.5 禁用rw007的ST…

举例详解 TCP/IP 五层(或四层)模型与 OSI七层模型对比 (画图详解 一篇看懂!)

目录 一、为什么要对协议进行分层 1、什么是协议分层 2、协议分层的好处 二、TCP/IP 五层&#xff08;或四层&#xff09;模型 1、概念 应用层 传输层 网络层 数据链路层 物理层 2、举例详解 传输层 网络层 数据链路层 和 物理层 应用层 四、TCP/IP 五层&…

《王者荣耀》游戏攻略:角色排行榜——墨子

作为天蝎座黄金圣斗士&#xff0c;墨子以他的正义感和荣誉感闻名&#xff0c;一直站在正义的一方&#xff0c;忠于女神雅典娜。他的猩红毒针象征着审判和死亡&#xff0c;而他所施加的十五针“安达里士”更是生命终结的预兆。在冥王再次发动战争之际&#xff0c;墨子追随雅典娜…

【第4讲】XTuner 微调 LLM:1.8B、多模态、Agent

目录 1 简介2 基础知识2.1 finetune简介2.2 xtuner简介2.2.1 技术架构2.2.2 快速上手xtuner 2.3 8GB显存玩转LLM&#xff08;intern1.8b&#xff09;2.3.1 flash attention vs deepspeed zero2.3.2 相关版本更新和使用 2.4 多模态LLM2.4.1 多模态LLaVA基本原理简介2.4.2 快速上…

MATLAB初学者入门(11)—— 贪心算法

贪心算法是一种简单直观的算法设计方法&#xff0c;常用于解决需要做出一系列选择以达到最优解的问题。贪心算法的核心思想是每一步都选择当前看起来最好的选项&#xff0c;而不考虑大局。这种方法通常易于实现&#xff0c;但不总是能得到全局最优解。下面&#xff0c;将详细介…

CWDM/DWDM系统应用解决方案

波分复用(WDM)包括粗波分复用(CWDM)和密集波分复用(DWDM)。 它是指在一根光纤上同时传输多个不同波长的信号。 主要目的 WDM就是增加光纤的可用带宽&#xff0c;无需铺设额外的光缆即可进行扩容。 因此&#xff0c;被电信公司广泛采用。 CWDM 和 DWDM 有什么区别&#xff1f; …

充电器进阶,原边恒流,单片机控制小电流(预充电)的方案

前言 很多充电器&#xff0c;为了能控制电流输出&#xff0c;也就是充电时需要有小电流、大电流的情况&#xff0c;都会用副边及单片机进行控制&#xff0c;但因为是副边控制&#xff0c;需要一个比较器、一个二极管、若干电阻、若干电容&#xff0c;整体BOM成本可能多了三毛钱…

小红书护肤行业笔记怎么写?纯干货!

小红书上都是年轻爱美的用户群体&#xff0c;所以护肤行业在小红书上做推广很吃香&#xff0c;小红书护肤行业笔记怎么写&#xff1f;接下来&#xff0c;伯乐网络传媒将从护肤行业笔记文案的特点和写作技巧两个方面给大家讲一讲。 一、护肤行业笔记文案特点 1. 突出个人情况 …

【Qcom Camera】DumpDebugInfo分析

DumpDebugInfo&#xff1a; DumpDebugInfo主要包括Session::DumpDebugInfo、Pipeline::Dumpdebuginfo、Node::Dumpdebuginfo、DRQ::Dumpdebuginfo、Usecase::DumpDebugInfo log&#xff1a;Hit SOF threshold of [xx] consecutive frames CamX: [ERROR][CORE ] camxpip…

Spring Boot入门(20):轻松搞定多数据源配置,Spring Boot与Mybatis-Plus的完美结合!

前言 本文将介绍如何在Spring Boot框架下使用mybatis-plus实现多数据源配置。多数据源配置是一个常见的需求&#xff0c;在实际项目中也经常遇到&#xff0c;因此掌握多数据源配置的技巧是非常重要的。 摘要 本文将为大家介绍如何使用Spring Boot和mybatis-plus实现多数据源…

路由过滤,策略实验

1配置ip [r1]int g0/0/0 [r1-GigabitEthernet0/0/0]ip add 100.1.1.1 24 [r1-GigabitEthernet0/0/0]int l0 [r1-LoopBack0]ip add 192.168.0.1 32 [r1-LoopBack0]int l1 [r1-LoopBack1]ip add 192.168.1.1 32 [r2]int g0/0/0 [r2-GigabitEthernet0/0/0]ip add 100.1.1.2 24 [r…

掌握区间合并:解决实际问题的算法策略和应用案例【python LeetCode题目56】

作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任大厂数据部门负责人。 会一些的技术&#xff1a;数据分析、算法、SQL、大数据相关、python 欢迎加入社区&#xff1a;码上找工作 作者专栏每日更新&#xff1a; LeetCode解锁1000题: 打怪升级之旅 python数据分析…

自动化测试的三种测试报告模板

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

java中多线程的创建方式及常用的方法

目录 概述 继承Thread类&#xff1a; 实现Runnable接口&#xff1a; 实现Callable接口&#xff1a; 示例代码 继承Thread类示例 实现Runnable接口示例 实现Callable接口示例 调用三种线程测试示例 线程常用的成员方法 概述 常见的创建线程的方式包括&#xff1a;继承…

Axure糖尿病健康管理APP原型图,医疗保健血糖监测饮食控制

作品概况 页面数量&#xff1a;共 50 页 源文件格式&#xff1a;rp格式&#xff0c;兼容 Axure RP 9/10&#xff0c;非程序软件无源代码 应用领域&#xff1a;医疗健康、慢病管理、糖尿病管理 作品特色 本作品为Axure糖尿病健康管理APP端原型图&#xff0c;设计规范内容清晰…

浏览器跨标签页通信的方式都有哪些

跨标签页的实际应用场景&#xff1a; 1. 共享登录状态&#xff1a; 用户登录后&#xff0c;多个标签页中需要及时获取到登录状态&#xff0c;以保持一致的用户信息。这种情况&#xff0c;可以使用浏览器的 localStorage 或者 sessionStorage 来存储登录状态&#xff0c;并通过…

difflib 标准库详解:Python 文本对比的利器

&#x1f340; 前言 博客地址&#xff1a; CSDN&#xff1a;https://blog.csdn.net/powerbiubiu &#x1f44b; 简介 difflib 模块是 Python 标准库中的一个模块&#xff0c;用于比较文本之间的差异。它提供了一些函数和类&#xff0c;可以帮助你找到两个字符串或列表之间的…

“傻瓜”学计量——核密度估计KDE

提纲&#xff1a; 什么是核密度估计&#xff0c;是干什么的 代码 1 前言 参数估计vs非参数估计参数估计是样本数据来自一个具有明确概率密度函数的总体。非参数估计是样本数据的概率分布未知&#xff0c;这时&#xff0c;为了对样本数据进行建模&#xff0c;需要估计样本数据…