在priority_queue下对容器、容器适配器的理解和实现

⚡【C++要笑着学】(23) 栈和队列类:stack | queue | 优先级队列 priority_queue | 双端队列 deque 学完栈和队列后,以后我们再需要用栈和队列的地方我们就不用自己去实现了,直接用就行。它们是通过容器适配器去实现的,本章我们先去学习如何去使用它们。此外我们还要讲解优先级队列 priority_queue 和双端队列 deque,deque 我们下一章实现 stack 和 queue 的时候会用到,所以放在这一章先讲解一下,至于 deque 涉及到的 "仿函数" 概念我们会再下一章讲实现的时候重点讲解!...... 阅读详情

原文地址:https://blog.youkuaiyun.com/qq_42837885/article/details/99566524

priority_queue

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

  1. 默认情况下priority_queue是大堆。

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

  3. 有些情况下,用户可能需要提供比较器规则

class Less 
{ 
public:    
	bool operator()(const Date* pLeft, const Date* pRight)    
	{        
		return *pLeft < *pRight;    
	} 
};

void TestPriorityQueue()
{
priority_queue<Date, vector<Date>, Less> q;
q.push(&Date(2019, 8, 14));
q.push(&Date(2019, 8, 15));
q.push(&Date(2019, 8, 16));
cout << *q.top() << endl;
return 0;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

为什么将stack、queue和priority_queue称作为容器适配器?

  • 虽然stack、queue、priority_queue中也可以存放元素,但在STL中并没有将其划分在容器的行列,而是将 其称为容器适配器,这是因为每个容器在底层都有自己的实现方式,而stack、queue、priority_queue只是 在底层将其他容器进行了封装。

什么是适配器?

  • 适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该中模式是将一个类的接口转换成客户希望的另外一个接口。

priority_queue的模拟实现

template<class T,class Sequence=vector<T>,class Compare=less<T>>
class priority_queue
{
public:
	priority_queue()
		:_seq()
	{}
	template<class InputIt>
	priority_queue(InputIt start, InputIt last)
		:_seq(start,last)
	{
		int parent = (_seq.size() - 2) >> 1;
		while (parent >= 0)
		{
			makeDown(parent);
			parent--;
		}
	}
	void push(const T& x)
	{
		_seq.push_back(x);
		makeUp(_seq.size() - 1);
	}
	void pop()
	{
		if (empty())
			return;
		swap(_seq.front(),_seq.back());
		_seq.pop_back();
		makeDown(0);
	}
	bool empty()const
	{
		return _seq.empty();
	}
	const T& top()const
	{
		return _seq.front();
	}
	size_t size()const
	{
		return _seq.size();
	}
private:
	void makeUp(int child)
	{
		int parent = (child - 1) >> 1;
		while (child)
		{
			if (_com(_seq[parent], _seq[child]))
			{
				swap(_seq[parent], _seq[child]);
				child = parent;
				parent = (child - 1) >> 1;
			}
			else
				return;
		}
	}
	void makeDown(int parent)
	{
		int child = parent * 2 + 1;
		while (child < _seq.size())
		{
			if (child + 1 < _seq.size() && _com(_seq[child], _seq[child + 1]))
				++child;
			if (_com(_seq[parent], _seq[child]))
			{
				swap(_seq[parent], _seq[child]);
				parent = child;
				child = parent * 2 + 1;
			}
			else
				break;
		}
	}
	Sequence _seq;
	Compare _com;
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79

为什么选择deque作为stack和queue的底层默认容器

stack是一种后进先出的特殊线性数据结构,因此只要具有push_back()和pop_back()操作的线性结构,都可以作为stack的底层容器,比如vector和list都可以;queue是先进先出的特殊线性数据结构,只要具有 push_back和pop_front操作的线性结构,都可以作为queue的底层容器,比如list。但是STL中对stack和 queue默认选择deque作为其底层容器,主要是因为:

  1. stack和queue不需要遍历(因此stack和queue没有迭代器),只需要在固定的一端或者两端进行操作。
  2. 在stack中元素增长时,deque比vector的效率高;queue中的元素增长时,deque不仅效率高,而且内存使用率高。
Open3D点云算法与点云深度学习案例汇总(长期更新) Open3D-python算法专栏文章汇总,长期更新算法原理与实战案例。 阅读详情

相关推荐

创意视觉项目实战:用ESP32-S3+OV5640构建智能图像流系统

本文详细介绍了如何使用ESP32-S3开发板与OV5640摄像头模块构建智能图像流系统。从硬件连接到软件配置,涵盖Arduino环境搭建、图像采集优化、WiFi视频流传输及外设集成,为开发者提供完整的实战指南,助力智能家居和机器人视觉项目开发。

tech5的博客 1292

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

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

Edward_Asia的博客 6340

SD - WAN:企业出海的网络加速器

例如,一家中国的跨境电商企业,在欧美市场的促销活动期间,借助 SD - WAN 技术,即使面对海量订单数据的交互,也能确保欧美客户在浏览商品、下单支付时感受到近乎本地网络的流畅体验,大大提升了客户满意度,稳住了销售增速。企业无需在海外本地部署大量冗余服务器,只需依托云台,借助 SD - WAN 快速稳定的网络连接,即可轻松实现业务拓展,进一步精简运营架构,提升整体效能。在未来,随着技术的不断演进和企业出海需求的持续增长,SD - WAN 将持续赋能,助力更多企业在全球市场扬帆远航,书写辉煌篇章。

idcicp_com的博客 446

c++的priority_queue各种使用方法

一般如果使用指针的话,就需要使用函数对象了。template

性感的小君君 6998

基于睿抗智能小车省赛第一题兵人识别的学习5.25

先用pip uninstall numpy卸载,再在后面输入pip install numpy==1.23安装版本为1.23的numpy。首先安装Anaconda环境;pycharm方便使用,安装yolov5以及一大堆数据包;由于python中的numpy插件包版本过高,训练失败,所以要安装一个版本低的包。每次运行都要先运行虚拟环境,输入:conda activate。图中所有精度大概在0.768-0.99之间。这里指定安装numpy1.23.。训练完成会得到一个衡量精度的指标。等待99张图片训练完成。

Haili_的博客 1299

Abaqus 单元与全局刚度矩阵导出实战指南:从INP修改到结果解析

本文提供了Abaqus中导出单元刚度矩阵和全局刚度矩阵的完整实战指南。通过详细步骤讲解INP文件修改、关键指令插入及结果文件解析,帮助工程师、研究人员和二次开发者深入理解有限元软件内核,实现理论验证、二次开发与深度问题调试。

k8s6orchestrator的博客 898

【C++】仿函数 -- priority_queue

仿函数的介绍及其使用,priority_queue 的介绍、使用及其模拟实现。

在平淡的日子里寻找存在的价值 1399

从零到一:华为iMaster NCE-Campus部署中的Euler OS与FusionInsight深度解析

本文深入解析华为iMaster NCE-Campus部署中Euler OS与FusionInsight的关键技术要点,包括RAID配置、网络绑定技术、安装避坑指南及性能调优方案。通过实战经验和详细配置示例,帮助工程师提升部署效率与系统稳定性,确保华为企业级解决方案的高效运行。

f6g7h8i9j的博客 549

优先级队列【C++】

priority_queue的模拟实现、仿函数

qq_2972806103的博客 1148

【EMC电磁兼容】02.04——原理图的实战落地细节

原理图上的关于EMC的落地体现一、元器件的选型二、原理图上的EMC体现在哪里?1.芯片电源管脚滤波去耦:2.时钟电路滤波设计3.低速电路滤波抗干扰设计4.通讯接口电路的防护滤波5.系统输入电源端口电路的防护滤波6.系统接地的定义7.芯片软件功能的审查 一、元器件的选型 ​ 原理图最初设计涉及到选型元器件方面: 元器件选型 不仅仅功能需要满足要求,还需要考虑其它细节参数在不同应力下的反应,封装的不同也会产生不同的变化。 元器件替代 常常因为成本原因进行器件替代,除了要考虑功能参数相同时也要考虑系统参数

Time to Forget 2243

【忍者算法】从生活案例理解滑动窗口最大值:一个超直观的思路讲解|LeetCode 239 滑动窗口最大值

点此看全部题解更多干货,请关注公众号【忍者算法】,回复【刷题清单】获取完整题解目录~

忍者算法的博客 632

C++之STL的priority_queue容器

它是一个优先队列,是一个基于优先级堆的容器适配器,底层容器默认使用vector,将vector封装成堆管理元素。默认是使用最大堆。priority_queue是有三个模版参数的1、第一个是class T:表示队列中元素的类型2、第二个是class Container = std::vector:表示底层容器的类型,从中就可以看到,默认是使用std::vector容器。

m0_47428520的博客 500

Apple Store 上架过包:iOS审核4.3被拒原因分析与解决修改方案

Apple Store 上架过包:iOS审核4.3被拒原因分析与解决修改方案

专业解决各种上架过包问题,专业团队专业处理 751

【C++自学笔记】STL—详细理解stcak和queue、priority_queue 及 其模拟实现(容器适配器)

一、stack的介绍和使用 1、stack的介绍 1、stack是一种容器适配器,专门用于具有LIFO(后进先出)的上下问环境中,其删除只能从容器的一端进行,元素的插入和提取操作; 2、stack时作为容器适配器被动实现的,容器适配器即使对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(栈顶)被压入或者弹出; 3、stack的底层...

C/C++菜鸟养成记 680

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

容器适配器stack,queue和priority_queue

一.什么是容器适配器 容器适配器是一个封装了序列容器的一个类模板,它在一般的序列容器的基础上提供了一些不同的功能。之所以称为容器适配器,是因为它是适配容器来提供其它不一样的功能。通过对应的容器和成员函数来实现我们需要的功能。 下面介绍了三个容器适配器:statk<T>,queue<T>,priority_queue<T>。 注意:容器适配器都不存在迭代器。 二.stack栈 2.1 stack的介绍 stac...

weixin_57023347的博客 2310

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

STL设计之容器适配器,加之经典题目解析

STL设计之queue,stack,priority_queue

小杰312的博客 3092

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

【C++】适配器stack/queue/priority_queue使用和实现

stack/queue/priority_queue的使用和实现

2301_81577798的博客 1万+

C++初阶之一篇文章教会你queue和priority_queue(理解使用和模拟实现)

queue模拟实现、什么是priority_queue、priority_queue的使用、priority_queue构造函数、模板参数 Compare、什么是仿函数?priority_queue的模拟实现

立志做一个高产且细节博主 657

C++ STL——Queue容器、priority_queue

一、queue 1、基本概念 Queue是一种容器适配器 C++ 标准库定义了三种类型的容器适配器:stack、queue 和 priority_queue。 每种适配器都限制了一些基础容器类的功能,以便对标准数据结构提供精确控制的接口。 Queue是一种先进先出(First In First Out,FIFO)的数据结构,它有两个出口。一个模板容器适配器类,它提供功能的限制,限制对一些基本容器类型的前端和后端元素的访问权限。 可以在后端添加或从前端移除元素,并且可以在队列的任何一端检查元素。 和

LiuXF93的博客 416

【C++】栈和队列法使用及实现原理

本篇文章会对C++中的容器stack和queue用法进行详解,也包含对优先队列(priority_queue)的讲解。同时会模拟实现stack、queue和priority_queue底层。希望本篇文章会对你有所帮助!

weixin_67596609的博客 1502

容器适配器中stack queue priority_queue的介绍及模拟实现

适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成他人希望的另外一个接口。

JuLiJuLi.的博客 861

C++ STL 中的 stack、queue 与 priority_queue:从使用到容器适配器原理

若优先队列存储自定义类型(如Date),需重载operator<(大堆)或operator>public:// 重载<:用于大堆(按日期升序,旧日期优先级低)// 重载>:用于小堆(按日期降序,新日期优先级低)// 友元函数:支持cout输出return os;private:// 测试:大堆与小堆// 大堆(默认,按日期降序,最新日期优先级最高)cout << "大堆顶(最新日期):" << pq1.top() << endl;// 小堆(按日期升序,最旧日期优先级最高)

cpparf的博客 1055

深入篇【C++】【容器适配器】:(stack)&&(queue)&&(priority_queue)模拟实现(详细剖析底层实现原理)

深入篇【C++】【容器适配器】:(stack)&&(queue)&&(priority_queue)模拟实现(详细剖析底层实现原理),理解底层架构,能够帮助你更好的使用以及开发,学不在多,而在精。

Extreme_wei的博客 743

STL——理解priority_queue

理解priority_queue的概念和底层实现原理,并且模拟实现

冯同学的博客 960

c++的学习之路:17、stack、queue与priority_queue

本文主要是介绍一下stack、queue、priority_queue的使用以及模拟实现,文章末附上代码以及思维导图。目录摘要一、stack的介绍和使用1、stack的介绍2、stack的使用3、stack的模拟实现二、queue的介绍和使用1、queue的介绍2、queue的使用3、queue的模拟实现三、priority_queue的介绍和使用1、priority_queue的介绍2、priority_queue的使用3、priority_queue的模拟实现四、代码1、stack2、queue。

weixin_64257568的博客 1148

C++ —— 容器适配器和仿函数

在已有的容器(vector、list)的基础上适配出其他的容器。就类似于手机、笔记本电脑的电源适配器,我们已有220V的家庭电源要适配出5V或其他电压的充电器。常用的容器适配器有stack(栈)、queue(队列)、priority_queue(优先级队列)以及反向迭代器。deque是一种容器,它的中文名为双端队列,但是它并不是一个队列。deque是综合了vector的优点和list的优点而集合在一起的,也就是说deque既能够支持随机访问也能够提高头尾、中间插入删除的效率。

weixin_59913110的博客 637
下一篇: 深蓝学院移动机器人路径规划笔记-图搜索
杂质想当杂志
博客等级 码龄10年 13粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值