stack/queue/priority_queue类

stack、queue、priority_queue、deque STL 阅读详情

目录

deque类

为什么实现stack和queue的类模板需要容器呢?

 deque是什么呢?

deque容器的优点:

deque的缺点:

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

stack类

stack的介绍

stack的模拟实现

queue类

queue的介绍

queue的模拟实现

priority_queue类

priority_queue的介绍

priority_queue的模拟实现

仿函数/函数对象


deque类

我们发现stack/queue在STL标准库中的底层结构都有deque容器。

为什么实现stack和queue的类模板需要容器呢?

虽然stack和queue中也可以存放元素,但在STL中并没有将其划分在容器的行列,而是将其称为
容器适配器,这是因为stack和queue只是对其他容器的接口进行了包装,STL中stack和queue默认
使用deque。 

 deque是什么呢?

deque是STL的一种容器,可以双向进出(即可以在头尾两端进行插入、删除操作),时间复杂度为O(1)。deque类似于一个动态的二维数组。

deque容器的优点:

我们知道vector的优点是可以根据下标进行随机访问,list的优点是可以高效的在任意位置插入删除。而deque则是结合了它们两个的优点,与vector比较,头插效率高,不需要搬移元素;与list比较,空间利用率比较高。

deque的缺点:

不适合遍历,在遍历时,deque的迭代器要频繁的去检测其是否移动到某段小空间的边界,导致效率低下,所以在实际中,需要线性结构时,大多数情况下优先考虑list、vector。

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

stack只要具有push_back()和pop_back()操作的线性结构,都可以作为stack的底层容器,比如list、vector。queue只要具有push_back()和pop_front()操作的线性结构,都可以作为queue的底层容器,比如list。但为什么STL中对stack和queue默认底层容器是deque呢?

1.stack和queue不需要遍历(因此stack和queue没有迭代器),只需要在头尾操作就可以。

2.deque效率高。

完美避开了deque的缺陷。

stack类

stack的介绍

1.在数据结构中我们学习过stack(栈),我们知道栈的特点是先进后出的。

2.该底层容器至少支持以下操作:

push :入栈

pop:出栈

empty:检测栈是否为空

size:返回队列中有效个数

top:返回栈顶元素

3.STL标准库中stack的底层结构

stack的模拟实现

#include<deque>
namespace slm
{
	template <class T,class Container=std::deque<T>>
	class stack
	{
	public:
		void push(const T& x)
		{
			_con.push_back(x);
		}
		void pop()
		{
			_con.pop_back();
		}
		const T& top()
		{
			return _con.back();
		}
		size_t size() const
		{
			return _con.size();
		}
		bool empty()
		{
			return _con.empty();
		}
	private:
		Container _con;
	};
}

queue类

queue的介绍

1.在数据结构中我们了解了queue(队列)的特点是先进先出(即在队尾入数据在队头出数据)。

2.该底层容器应至少支持以下操作:
empty:检测队列是否为空
size:返回队列中有效元素的个数
front:返回队头元素的引用
back:返回队尾元素的引用
push_back:在队列尾部入队列
pop_front:在队列头部出队列 

3.STL中queue的底层结构

queue的模拟实现

#include<deque>
namespace slm
{
	template<class T,class Container=std::deque<T>>
	class queue
	{
	public:
		void push(const T&x)
		{
			_con.push_back(x);
		}
		void pop()
		{
			_con.pop_front();
		}
		const T& front()
		{
			return _con.front();
		}
		const T& back()
		{
			return _con.back();
		}
		size_t size()const
		{
			return _con.size();
		}
		bool empty()
		{
			return _con.empty();
		}
	private:
		Container _con;
	};
}

priority_queue类

priority_queue的介绍

1.优先级队列也是一种适配器,但是在STL中默认使用vector作为priority_queue的底层容器。

2. 优先级队列不同于queue的是,优先级队列根据严格的弱排序标准,它的第一个元素总是最大的。

3.优先级队列实际上就是堆。在vector上使用了堆算法将vector中元素构造成堆的结构。默认情况下优先级队列是大堆(堆顶是最大的数)。

4.支持以下操作:
empty():检测容器是否为空
size():返回容器中有效元素个数
front():返回容器中第一个元素的引用
push_back():在容器尾部插入元素
pop_back():删除容器尾部元素

priority_queue的模拟实现

#include<vector>
namespace slm
{
	//比较大小
	template<class T>//越往后数越小
	class less
	{
	public: 
		bool operator()(const T& x, const T& y)//仿函数
		{
			return x < y;
		}
	};
	template<class T>
	class greater//越往后数越大
	{
		bool operator()(const T& x, const T& y)//仿函数
		{
			return x > y;
		}
	};
	template<class T,class Container=std::vector<T>,class compare=less<T>>//大堆
	class priority_queue
	{
	public:
		void adjust_up(size_t child)//向上调整
		{
			size_t parent = (child - 1) / 2;
			compare com;
			while (child > 0)
			{
				if (com(_con[parent], _con[child]))
				{
					std::swap(_con[parent], _con[child]);
					child = parent;
					parent = (child - 1) / 2;
				}
				else
				{
					break;
				}
			}
		}
		void push(const T& x)
		{
			_con.push_back(x);
			adjust_up(_con.size() - 1);
		}
		void adjust_down(size_t parent)//向下调整
		{
			compare com;
			size_t child = parent * 2 + 1;
			while (child < _con.size())
			{
				if (child + 1 < _con.size() && com(_con[child], _con[child + 1]))
				{
					child++;
				}
				if (com(_con[parent], _con[child]))
				{
					std::swap(_con[parent], _con[child]);
					parent = child;
					child = parent * 2 + 1;
				}
				else
				{
					break;
				}
			}
		}
		void pop()
		{
			std::swap(_con.front(), _con[_con.size() - 1]);
			_con.pop_back();
			adjust_down(0);
		}
		const T& top()
		{
			return _con.front();
		}
		size_t size()const
		{
			return _con.size();
		}
		bool empty()
		{
			return _con.empty();
		}
	private:
		Container _con;
	};
}

仿函数/函数对象

在上面优先级队列的代码中存在有仿函数。

那什么是仿函数呢 ?

在C++中,仿函数(也称为函数对象)是一种使用类来模拟函数行为的技术。通过重载类的operator(),可以创建一个行为类似于函数的对象。相比于函数指针,仿函数有更快的执行速度。因为它们是通过重载运算符来实现的,而不是通过地址调用。

C++——STL(stack类、queue类) STL——stack、queue 阅读详情

相关推荐

An example: 2D immersed boundary lattice Boltzmann method code--By Timm Krüger.2011.

//谢谢Timm Krüger大佬的代码。 还是老样子,有啥问题Feel free to tell us~毕竟群众力量大嘛~QQ群:293267908。 // 话不多说,上干货! // ISBN 978-3-319-44649-3 (Electronic) // 978-3-319-44647-9 (Print) // http://www.springer.c...

weixin_37783345的博客 1418

STL模板

序列式容器 向量(vector) 连续存储的元素<vector> 列表(list) 由节点组成的双向链表,每个结点包含着一个元素<list> 双端队列(deque) 连续存储的指向不同元素的指针所组成的数组<deque> 适配器容器 栈(stack) 后进先出(LIFO)的值的排列 <stack> 队列(queue) 先进先出(FIFO)...

kongxian2007的专栏 327

扫地机器人视觉+IMU融合导航路径规划技术详解

本文介绍了基于视觉-惯性里程计(VIO)的扫地机器人自主导航系统。系统硬件由RGB摄像头、IMU传感器和编码器组成,软件架构采用分层设计,包括传感器数据采集层、数据融合层、SLAM定位层和路径规划层。核心技术包括:1)融合视觉特征提取(ORB算法)与IMU预积分的VIO;2)基于栅格地图的SLAM构建;3)结合A*全局规划和动态窗口法(DWA)局部避障的路径规划。文章提供了完整的Python实现代码,涵盖传感器数据融合、特征匹配和运动估计等关键功能模块。该系统实现了扫地机器人的精准定位和环境感知能力。

电脑管家 1463

stack 和 queue 使用及模拟实现

stack和queue的介绍及模拟实现,优先级队列和deque的讲解

qq_61939403的博客 722

vue中使用video-player视频插件,第一次无法监听父组件穿过来的值解决办法

需求: 页面![在这里插入图片描述](https://img-blog.csdnimg.cn/20201208141906802.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0FfOTg4OA==,size_16,color_FFFFFF,t_70) 作品清单是从后端请求回来的不同格式的url,前端需求根据后缀动态判断格式,然后对齐进行下载和

A_9888的博客 769

衡山派Luban-Lite系统SDIO无线网络配置实战:以D133CBV-QFN88开发板与RTL8189模组为例

本文详细介绍了在衡山派D133CBV-QFN88开发板上,为Luban-Lite系统配置SDIO无线网络的完整实战流程。通过配置SDMC接口、RTL8189 Wi-Fi驱动、lwIP协议栈及内核参数,并解决编译分区问题,最终实现Wi-Fi网络连接与测试,为嵌入式设备联网提供清晰指导。

weixin_35677363的博客 267

【C++从入门到踹门】第十篇:stack,queue,priority_queue实现

目录stack的实现了解deque实现stackqueue的实现deque 的优势priority_queue的实现heap 堆heap 算法加入新元素删除堆顶元素实现简单 priority_queue仿函数less 仿函数greater 仿函数priority_queue 的实现代码全貌 stack的实现 stack 的本质是一个容器适配器。 适配器是一种机制,通过修改已有容器的接口来形成我自己的风格。一个容器适配器接受一种已有的容器类型,使其行为看起来像一种不同的类型。 观察stack的模板

qq_43041053的博客 1702

一次HTTP完整得请求过程

一次HTTP完整的请求过程 一,大致流程: 根据域名和DNS解析到服务器的IP地址(DNS+CDN) 通过ARP协议获得IP地址对应的物理机器得MAC地址 浏览器对服务器发起三次握手 建立TCP连接后发起HTTP请求报文 服务器响应HTTP请求,将响应报文返回浏览器 短连接情况下,请求结束通过TCP四次挥手关闭连接,长连接在没有访问服务器得若干时间后,进行连接关闭 浏览器得到响应信...

qq_40760617的博客 344

priority_queue(优先级队列)

在C++中,priority_queue是一个容器适配器,它提供了常数时间的最大元素查找。它通常实现为堆。堆是一种数据结构,其中最大(或最小)元素始终位于顶部。priority_queue是一个模板类,定义在头文件中。它有三个模板参数:元素类型、容器类型和比较函数类型(可选)。默认情况下,它使用std::vector作为其底层容器。

k5426244的博客 7909

MATLAB并行开不了的解决办法

在服务器上新安装了MATLAB 2013b,在开并行计算的时候出现了下列问题 经过在网上搜多这个问题,我感觉这个问题应该是安装的时候的验证问题或者激活不成功之类的。注意其中有一句validate the profile ‘local’ in the Cluster Profile Manager.在matlab官网上找到了设置Cluster Manager的教程,如下 parallel>

sinat_36713319的博客 5987

OpenClaw-遇到的问题-Health check failed: gateway closed (1006 abnormal closure (no close frame)): no clos

OpenClaw网关服务安装成功但运行异常,显示健康检查失败(错误代码1006)。系统提供了Web控制界面(http://127.0.0.1:18789/)和带令牌的安全访问链接。文档建议参考故障排除指南,并提供了可选应用扩展功能(包括移动端支持)。注意运行本地代理存在安全风险,建议加固系统配置。若需启用网络搜索功能,需配置Brave搜索API密钥。安装完成后会自动打开仪表盘,需保持浏览器标签页以控制OpenClaw服务。

直到世界的尽头 1万+

stl priority_deque

priority_deque 优先队列,核心其实是几个函数:make_heap()

lswdcyy的博客 324

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

C++ | 容器stack&queue

本文介绍了C++中stack和queue的基本使用方法,并通过实际代码演示了它们的常见操作。stack部分展示了push、empty、top、pop和swap等接口的使用;queue部分演示了push、empty、front、back和swap等操作。此外,文章还提供了三个相关算法题目:最小栈问题采用双栈解法,栈的压入弹出序列通过直接模拟解决,逆波兰表达式则借助栈结构求值。这些内容帮助读者理解栈和队列的基本特性及其在实际问题中的应用。

wyzy_Dawn的博客 478

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

[算法竞赛]九、C++标准模板库STL常用容器大全

自定义优先队列的排序算法主要有两种一种是重载运算符// 自定义类:学生,按成绩排序int score;// 重载 < 运算符:默认大顶堆(成绩高的优先)// 注意:大顶堆用 <,小顶堆用 >// 堆顶:Bob(95)// Bob 95return 0;一种是自定义函数对象int score;// 自定义函数对象:小顶堆(成绩低的优先)// 小顶堆用 >// 声明:底层 vector,比较函数 CompareScore// 堆顶:Alice(85)

2403_88610146的博客 447

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

一文搞懂C++容器篇

C++常用容器摘要: C++ STL提供了三大类容器:序列式容器(vector/list/deque/array)、关联式容器(set/map等)和容器适配器。vector是最常用的动态数组,支持快速随机访问但中间插入较慢;list是双向链表,任意位置插入高效但访问慢;set/map基于红黑树实现有序存储和快速查找。选择容器需考虑数据访问模式(随机/顺序)、插入删除频率和内存需求。vector适合频繁随机访问,list适合频繁插入删除,set/map适合需要快速查找的场景。合理选择容器能显著提升程序性能。

I Promise的博客 1331

C++STL学习

在刷题时,我们几乎一定会用到各种数据结构来辅助我们解决问题,因此我们必须熟悉各种数据结构的特点。

c3152144837的博客 307

常见STL

/ 默认创建一个存储整数的空 vector// 创建一个包含 5 个整数的 vector,每个值都为默认值(0)// 创建一个包含 5 个整数的 vector,每个值都为 10// 初始化一个包含元素的 vector// 构造并指定初始容量//头文件//初始化定义set<int> s;// 初始化指定元素// b和a一样,同样是拷贝初始化//node是结构体类型//头文件//定义初始化//添加头文件//初始化定义//头文件//初始化定义// 空列表。

2301_80064800的博客 972

C++STL18种容器类详解

本文摘要: C++ STL容器详解:18种容器类型概览 C++标准模板库(STL)提供了丰富的容器类型,主要分为三大类:序列容器、关联容器和容器适配器。

ATTOTC的博客 350

STL 常用容器

默认底层:vector。默认底层:deque。默认底层:deque。

Rick_Theseusr的博客 162

c++--stack,queue,priority_queue

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

includeevey的博客 2269

C++:stack、queue、priority_queue增删查改模拟实现、deque底层原理

一、C++stack的介绍和使用;二、C++queue的介绍和使用;3.1 deque的简单介绍(了解)、3.2 deque的缺陷、3.3 为什么选择deque作为stack和queue的底层默认容器四、priority_queue的介绍和实现 4.1 priority_queue的介绍 4.1 priority_queue的介绍增删查改模拟实现 前言 4.1.1 push() 4.1.2 pop() 4.3 top()、size()、empty() 4.1 priority_queue(优先级队列)增删查

Zhenyu_Coder的博客 4534

STL(C++)——stack类和queue类模板

我们接下来的这篇博客所要讲的内容就是我们前面在数据结构部分已经讲过的stack和queue部分的内容,与之不同的是,我们这里来讲讲它的模板,这里模板的底层实现和我们在数据结构中所讲述的知识基本上是如出一辙的,主要还是以使用的讲解为主要讲解部分。我在这里为大家推荐一个英语的相关网站,希望对大家在学习STL时能够有所帮助。

2301_81390458的博客 2144

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

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

Xpccccc的博客 1221

STL—stack/queue/priority_queue_/deque

讲述了STL库中stack和queue以及priority_queue的学习和模拟实现。深度学习这三个容器适配器、并且学习和理解了deque的原理和底层结构。其优劣性的分析

aaa114514aaaa的博客 1992

C++《stack与queue》

在之前的章节我们学习了C++当中string、vector和list三种容器并且试着模拟实现这三种容器,那么接下来在本篇当中我们将STL当中的stack和queue,并且在学习stack和queue的使用之后和之前一样还会试着模拟实现stck和queue。在此我们还要了解到stack和queue是一种容器适配器,那么在这之前就要了解容器适配器是什么。最后我们还要了解一种双端队列的容器,并且分析其与vector和list的区别,那么接下来就开始本篇的学习吧!

mljy.博客 2055
上一篇: vector类及模拟实现
下一篇: C++之list类及模拟实现
噜啦噜啦嘞好
博客等级 码龄3年 212粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值