C++ - priority_queue

C++从入门到起飞之——priority_queue(优先级队列) 全方位剖析! / 创建一个小顶堆(通过自定义比较器)// 输出10// 输出20return 0;不仅仅局限于存储基本数据类型,也可以存储自定义的类型。要使自定义类型能够被正确排序,必须定义比较运算符。// 定义一个结构体int age; 阅读详情

目录

一、介绍

二、仿函数

三、priority_queue实现

1.构造

2.插入和删除

3.剩余接口

四、完整代码


一、介绍

        priority_queue叫做优先级队列,适配容器是vector。其实就是数据结构中的堆,默认是大堆。若需要小堆,则需要修改模板中的仿函数类型。

template<class T,class Container = vector<T>,class Compare = less<T>>

二、仿函数

        仿函数就是operator(),通过重载括号使得对象可以像函数一样通过括号来传递参数调用。

由于堆中的向上/下调整算法需要父子节点的比较,不同的比较方式生成不同的大堆或小堆。于是我们使用模板中传递不同的仿函数结构类型就可以控制优先级队列的大小堆形态。

	template<class T>
	struct greater
	{
		bool operator()(const T& a, const T& b)
		{
			return a > b;
		}
	};

	template<class T>
	struct greater
	{
		bool operator()(const T& a, const T& b)
		{
			return a < b;
		}
	};

        堆中的向上和向下调整具体算法实现。

        void adjust_up(size_t child)
		{
			Compare com;
			int father = (child-1) / 2;
			while (child > 0)
			{
				if (com(_con[father], _con[child]))
				{
					std::swap(_con[child], _con[father]);
					child = father;
					father = (child - 1) / 2;
				}
				else
					break;
			}
		}
		void adjust_down(size_t father)
		{
			Compare com;
			size_t child = father * 2 + 1;
			while (child < _con.size())
			{
				if (child+1 < _con.size() && com(_con[child], _con[child+1]))
					child++;
				if (com(_con[father], _con[child]))
				{
					std::swap(_con[father], _con[child]);
					father = child;
					child = father * 2 + 1;
				}
				else
					break;
			}
		}

三、priority_queue实现

1.构造

        无参构造、拷贝构造和析构使用系统默认的就可以满足使用了,不用自己写。

        迭代器构造,在将数组建立起来后,从最后一个的非叶子节点开始向下调整,一直到根节点结束,完成一个堆的建立。

        priority_queue(){}

		template <class InputIterator>
		priority_queue(InputIterator first, InputIterator last)
			:_con(first, last)
		{
			for (int i = (_con.size() - 1 - 1)/2; i >= 0; i--)
			{
				adjust_down(i);
			}
		}

2.插入和删除

        插入时使用适配容器尾插,再对新插入的位置进行向上调整即可。

        删除时注意不能先使用适配容器的删除,应该把堆顶的数据和最后一个位置的数据交换,再使用适配容器的尾删,将原堆顶数据弹出。最后从新堆顶开始向下调整一下重新生成堆。如果冒然直接使用适配容器的头删删除堆顶,那么就会导致整个堆的结构被破坏。

		void push(const T& x)
		{
			_con.push_back(x);
			adjust_up(_con.size() - 1);
		}
		void pop()
		{
			std::swap(_con[0], _con[_con.size() - 1]);
			_con.pop_back();
			adjust_down(0);
		}

3.剩余接口

        剩余的一些接口就比较简单了,直接使用适配容器的接口即可轻松实现。

		void push(const T& x)
		{
			_con.push_back(x);
			adjust_up(_con.size() - 1);
		}
		void pop()
		{
			std::swap(_con[0], _con[_con.size() - 1]);
			_con.pop_back();
			adjust_down(0);
		}

四、完整代码

#include<vector>
using namespace std;
namespace lwh
{	
	template<class T>
	struct greater
	{
		bool operator()(const T& a, const T& b)
		{
			return a > b;
		}
	};

	template<class T>
	struct less
	{
		bool operator()(const T& a, const T& b)
		{
			return a < b;
		}
	};

	template<class T,class Container = vector<T>,class Compare = less<T>>
	class priority_queue
	{
	private:
		void adjust_up(size_t child)
		{
			Compare com;
			int father = (child-1) / 2;
			while (child > 0)
			{
				if (com(_con[father], _con[child]))
				{
					std::swap(_con[child], _con[father]);
					child = father;
					father = (child - 1) / 2;
				}
				else
					break;
			}
		}
		void adjust_down(size_t father)
		{
			Compare com;
			size_t child = father * 2 + 1;
			while (child < _con.size())
			{
				if (child+1 < _con.size() && com(_con[child], _con[child+1]))
					child++;
				if (com(_con[father], _con[child]))
				{
					std::swap(_con[father], _con[child]);
					father = child;
					child = father * 2 + 1;
				}
				else
					break;
			}
		}
	public:
		priority_queue(){}

		template <class InputIterator>
		priority_queue(InputIterator first, InputIterator last)
			:_con(first, last)
		{
			for (int i = (_con.size() - 1 - 1)/2; i >= 0; i--)
			{
				adjust_down(i);
			}
		}

		bool empty() const
		{
			return _con.empty();
		}
		size_t size() const
		{
			return _con.size();
		}
		const T& top() const
		{
			return _con[0];
		}
		void push(const T& x)
		{
			_con.push_back(x);
			adjust_up(_con.size() - 1);
		}
		void pop()
		{
			std::swap(_con[0], _con[_con.size() - 1]);
			_con.pop_back();
			adjust_down(0);
		}
	private:
		Container _con;
	};
}
c++ 优先队列(priority_queue) C ++中的优先队列是STL中的派生容器,它仅考虑最高优先级元素。队列遵循FIFO策略,而优先队列根据优先级弹出元素,即,优先级最高的元素首先弹出。 它在某些方面类似于普通队列,但在以下方面有所不同: 在优先队列中,队列中的每个元素都与某个优先级相关联,但是优先级在队列数据结构中不存在。 优先队列中具有最高优先级的元素将被首先删除,而队列遵循FIFO(先进先出)策略,这意味着先插入的元素将被首先删除。 如果存在多个具有相同优先级的元素,则将考虑该元素在队列中的顺序。 注意:优 阅读详情

相关推荐

C++STL之priority_queue的简单使用_在c++stl中priority_queue用法

priority_queue(优先级队列)模拟的也是队列这种存储结构,它底层采用堆结构存储数据,即使用此容器存储元素只能“从一端进(称为队尾),从另一端出(称为队头)”,且每次只能访问 priority_queue 中位于队头的元素。但是,priority_queue 中元素的存和取,遵循的并不是 “First in,First out”(先入先出)原则,而是“First in,Optimal out”原则。指的就是先进队列的元素并不一定先出队列,而是优先级最大的元素最先出队列。

2301_82244279的博客 1187

c++ priority_queue用法 入门必看 超详细

基本定义默认是使用大顶堆的,即队首总是最大的元素priority_queue 容器名如:储存int型数据的优先级队列 priority_queue q;储存double型数据的优先级队列 priority_queue q;储存string型数据的优先级队列 priority_queue q;储存结构体或者类的优先级队列 priority_queue q;less 即使用大顶堆。

weixin_52115456的博客 2万+

攻防世界GFSJ1184_welcome_CAT_CTF

由于它是 PIE 可执行文件,程序加载地址会随机化,这导致你在 GDB 调试时需要处理地址偏移(如 0x246d 变成 0x55555540246d)。:client 程序通过网络连接(get_nc() 和 get_flag(nc))与 server 通信,server 监听在端口 8888。:client 依赖外部共享库(如 libstdc++.so),因此运行时需要这些库存在系统中。程序就是wasd移动,走到不同标记(* $ @ )下方,输入j回车,会有不同反应。两个文件client和server。

拥抱AI的老粽子 1262

【C++】priority_queue(优先级队列)

1. prioriy_queue介绍 如果我们给每个元素都分配一个数字来标记其优先级,不妨设较小的数字具有较高的优先级,这样我们就可以在一个集合中访问优先级最高的元素并对其进行查找和删除操作了。 这样,我们就引入了优先级队列 这种数据结构。 优先级队列(priority queue) 是0个或多个元素的集合,每个元素都有一个优先权,对优先级队列执行的操作有(1)查找(2)插入一个新元素 (3)删除 ,一般情况下,查找操作用来搜索优先权最大的元素,删除操作用来删除该元素 。 对于优先权相同的元素,可按

Edward_Asia的博客 6340

避开RK3588开发板SDIO配置的坑:O9201SB WiFi模组接入实战指南

本文为嵌入式开发者提供了在RK3588开发板上,利用TF卡槽接入O9201SB WiFi6模组的实战指南。文章深度剖析了SDIO配置中常见的电源管理序列冲突问题,并给出了从设备树节点修改、内核编译到系统验证的完整解决方案,帮助开发者避开配置陷阱,成功实现高性能无线连接。

sprite的博客 954

手把手教学|用飞书+扣子工作流实现自动化批量图片生成,效率提升99%!体验完整操作流程

在先前的文章中,我们已经深入探讨了扣子智能体的多种应用场景,以及如何创建和使用工作流进行高效管理。本文将引领大家通过一个具体案例,将扣子的工作流功能嵌入飞书应用中,实现操作的自动化与高效化。

weixin_66485800的博客 6028

【C++】queue和priority_queue

队列以及优先级队列

s_little_monster的博客 9615

用ESP32-S3+OV2640摄像头+ILI9488屏,DIY一个能联网的智能猫眼(附完整代码)

本文详细介绍了如何利用ESP32-S3微控制器搭配OV2640摄像头和ILI9488显示屏,DIY一个功能强大的智能猫眼系统。从硬件选型、电路设计到软件开发,提供了完整的解决方案和优化技巧,包括图像采集显示、WiFi远程访问及低功耗设计,适合智能家居爱好者动手实践。

weixin_30897233的博客 501

【C++】—— priority_queue与仿函数

仿函数呦

yusjushd的博客 2288

Windows 10/11 注册表 ProfileImagePath 误改修复:3步恢复用户登录与数据安全

本文详细介绍了Windows 10/11系统中因误改注册表ProfileImagePath键值导致用户无法登录的修复方法。通过3个关键步骤,包括定位SID、安全修复注册表项及验证处理,帮助用户恢复登录并保障数据安全。特别强调了操作顺序的重要性以避免数据丢失,适用于各类Windows用户账户登录错误的紧急处理。

chuoshao2508的博客 403

融合Retinex理论与Transformer的YOLOv8低光照目标检测增强方法【YOLOv8】

图像分解:将输入图像分解为光照成分和反射成分。光照估计:估计光照图以消除暗光区域。图像重建:将光照增强后的反射图像重建成最终图像。Retinexformer通过在Transformer中引入Retinex的图像增强思路,使得低光照图像的细节能够得到充分保留。本文提出了一种基于Retinexformer的低光照增强方法,用于改进YOLOv8模型在夜间和低光照环境下的目标检测性能。

博客 1929

c++--stack,queue,priority_queue

栈,队列,优先级队列,deque,仿函数

includeevey的博客 2269

Ubuntu零基础教学-史上最详Ubuntu20.04安装教程,超级详细,强烈建议收藏!

官网地址:https://www.vmware.com/ 1、VMware Workstation Pro 15.5.1在Windows 10的安装不再介绍了,一路下一步即可。 2、下面详细介绍在VMware 虚拟机里安装Ubuntu 20.04 LTS的步骤

**My Coding Family** 2万+

C++容器适配器stack、queue、priority_queue

C++容器适配器stack、queue、priority_queue

Xpccccc的博客 1221

CLRNet车道线检测模型在Orin Nano Super开发板上的全栈部署与优化实践

本文详细介绍了将CLRNet车道线检测模型部署到NVIDIA Orin Nano Super开发板的全过程。内容包括:1) Orin开发板硬件规格分析;2) JetPack SDK环境配置与Python虚拟环境搭建;3) CLRNet模型架构解析与PyTorch实现;4) 模型转换与TensorRT加速优化方法。通过系统性的环境配置、模型转换和性能优化,为边缘计算场景下的车道线检测应用提供了完整的解决方案,实现了在Orin平台上的高效部署。

huanghm88的专栏 226

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

C++ priority_queue的使用及模拟实现

好多天没有更新博客了,最近一直在忙着学linux和自己的专业课(因为博主不是科班的~)。现在在学校感觉时间有些紧,等到期末考完了,博主就全身心把linux博客总结并分享给大家~ 优先级队列也是STL库中非常实用的一个容器。底层实现和堆很相似,这个容器又和之前讲的string、vector、list...模板参数上有些区别,今天来和老铁们一起见识一下这个容器~ 目录 priority_queue的介绍 p...

qq_58724706的博客 2681

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

【C++】priority-queue的底层原理及实现

首先在进入优先级队列的学习之前,我们需要先对优先级队列有一定的了解。优先级队列是容器适配器中的一种,元素在队列中的顺序是按照它们的优先级来排列的,而不是按照它们被插入的队列的顺序。这其实就是数据结构中的堆,其底层都是以数组存储的完全二叉树,下面就来详细了解一下priority-queue是如何进行使用的。Priority Queue(优先级队列) 是一种特别的数据结构,它为队列中的每个元素都分配了一个优先级。在这个队列里,元素并非按照被插入的顺序来排列,而是依据它们的优先级来排序。

2301_81044829的博客 2286

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

C++ queue和priority_queue

queue 和 priority_queue 都是容器适配器,要使用它们,必须包含头文件 。 queue queue 就是“队列”。队列是先进先出的,和排队类似。队头的访问和删除操作只能在队头进行,添加操作只能在队尾进行。不能访问队列中间的元素。 queue 可以用 list 和 deque 实现,默认情况下用 deque 实现。 queue 的定义如下: template < class ...

weixin_45743799的博客 676

C++中的queue与priority_queue

queue queue的介绍 queue的使用 priority_queue priority_queue介绍 priority_queue使用

君子慎独,不欺暗室。卑以自牧,含章可贞。 725

【C++】STL--priority_queue和queue

适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设 计经验的总结),该种模式是将一个类的接口转换成客户希望的另外一个接口deque的原理介绍deque(双端队列):是一种双开口的"连续"空间的数据结构,双开口的含义是:可以在头尾两端进行插入和删除操作,且时间复杂度为O(1),与vector比较,头插效率高,不需要搬移元素;与 list比较,空间利用率比较高。

2301_78724721的博客 1230

【C++】stack、queue、priority_queue的模拟实现

2、队长被实现为容器适配器,这些类使用特定容器类的封装对象作为其底层容器,提供一组特定的成员函数来访问其元素。2. 队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供。3. 优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue。3. 底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。4. 底层容器可以是任何标准容器类模板,也可以是其他特定设计的容器类。底层是一个堆,在堆后中插入数据,数据就乱了,因此要向上调整堆的数据。

C/C++、数据结构、Linux.... 1244

【C++】Queue与Priority Queue

STL库中Queue与Priority Queue 详解

weixin_61091020的博客 1万+

c++ priority_queue

首页 > 编程笔记 > C++笔记 阅读:27,279 C++ priority_queue(STL priority_queue)用法详解 C语言中文网推出辅导班啦,包括「C语言辅导班、C++辅导班、算法/数据结构辅导班」,全部都是一对一教学:一对一辅导 + 一对一答疑 + 布置作业 + 项目实践 + 永久学习。QQ在线,随时响应! 不出所料,priority_queue 容器适配器定义了一个元素有序排列的队列。默认队列头部的元素优先级最高。因为它是一个队列,所以只能访问第一个元素,...

clutch020的博客 509

C++ STL priority_queue

优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。优先级队列,在解决TopK问题,排序等场景,都有很大作用。

qq_63943454的博客 542

【C++】stack、queue和priority_queue的模拟实现

之前已经模拟实现了vector和list,在这篇博文中,我们要对stack,queue和priority_queue进行模拟实现。适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成客户希望的另外一个接口。在 C++ 标准库中,容器适配器(Container Adaptors)是一种特殊的容器,它们并非独立的容器类型,而是对现有容器类型进行了封装和适配,以提供特定的接口和行为。

2301_79601095的博客 893
上一篇: C++ - stack和queue模拟实现
下一篇: Linux - 进程程序替换
机械狗pp
博客等级 码龄6年 34粉丝 55原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值