【STL】queue

news2025/4/2 3:10:53

q u e u e queue queue 是一种容器适配器,设计为先进先出( F i r s t   I n   F i r s t   O u t ,   F I F O First\ In\ First\ Out,\ FIFO First In First Out, FIFO)的数据结构,有两个出口,将元素推入队列的操作称为 p u s h push push, 将元素推出队列的操作称为 p o p pop pop。因此,只要能满足队列结构要求的容器都可以作为 q u e u e queue queue 的底层容器。同时,由于 q u e u e queue queue 不允许有遍历行为(只能取队头元素),因此 q u e u e queue queue 没有迭代器

文章目录

  • 前言 —— 容器适配器
  • 一、queue 的介绍
  • 二、queue 的使用(常用接口)
  • 三、queue 的模拟实现
  • 四、STL 标准库中的 queue
    • 1. 底层结构
    • 2. 模拟实现
  • 总结


前言 —— 容器适配器

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

在这里插入图片描述


一、queue 的介绍

关于 q u e u e queue queue 的介绍,建议去查 C C C++ 官方文档: q u e u e queue queue 的文档介绍

在这里插入图片描述

以下为 q u e u e queue queue 的官方文档介绍:

  1. 队列是一种容器适配器,专门用于在 F I F O FIFO FIFO 上下文(先进先出)中操作,其中从容器一端插入元素,另一端提取元素。

  2. 队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类 q u e u e queue queue 提供一组特定的成员函数来访问其元素。元素从队尾入队列,从队头出队列。

  3. 底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。该底层容器应至少支持以下操作:
    (1)empty:检测队列是否为空。
    (2)size:返回队列中有效元素的个数。
    (3)front:返回队头元素的引用。
    (4)back:返回队尾元素的引用。
    (5)push_back:在队尾入队列。
    (6)pop_front:在队头出队列。

  4. 标准容器类 d e q u e deque deque l i s t list list 满足了这些要求。默认情况下,如果没有为 q u e u e queue queue 实例化指定容器
    类,则使用标准容器。

在这里插入图片描述


二、queue 的使用(常用接口)

下面只列举了 q u e u e queue queue 最常用的几个接口,更多详细信息可以自行查官方文档: q u e u e queue queue

可以看出 q u e u e queue queue v e c t o r vector vector l i s t list list 都不一样,第二个模板参数从 alloc 变为了 Container,缺省值说明标准库里的 q u e u e queue queue 默认 d e q u e deque deque 容器的容器适配器
t e m p l a t e < c l a s s   T , c l a s s   C o n t a i n e r = d e q u e < T > > c l a s s   q u e u e ; template <class\ T, class\ Container = deque<T> > class\ queue; template<class T,class Container=deque<T>>class queue;

函数说明接口说明
q u e u e ( ) queue() queue()构造空的队列
e m p t y ( ) empty() empty()检测队列是否为空,是返回 t r u e true true,否则返回 f a l s e false false
s i z e ( ) size() size()返回队列中有效元素的个数
f r o n t ( ) front() front()返回队头元素的引用
b a c k ( ) back() back()返回队尾元素的引用
p u s h ( ) push() push()在队尾将元素 v a l val val 入队列
p o p ( ) pop() pop()将队头元素出队列

三、queue 的模拟实现

因为 q u e u e queue queue 的接口中存在头删和尾插,因此使用 v e c t o r vector vector 来封装效率太低,故可以借助 l i s t list list 来模拟实现 q u e u e queue queue

也就是说, q u e u e queue queue 作为容器适配器,是直接封装其他容器的部分功能,只要能实现 q u e u e queue queue 的基本功能,就能够作为 q u e u e queue queue底层实现容器,如: l i s t list list d e q u e deque deque

这里使用 l i s t list list 容器为底层默认容器来模拟实现的 q u e u e queue queue

#include <list>

using namespace std;

namespace ybc
{
	//用 Container 适配转换出 queue
	template<class T, class Container = list<T>> //给list缺省值
	class queue
	{
	public:
		void push(const T& x)
		{
			_con.push_back(x);
		}

		void pop()
		{
			_con.pop_front();
		}

		const T& front() const
		{
			return _con.front();
		}

		const T& back() const
		{
			return _con.back();
		}

		size_t size() const
		{
			return _con.size();
		}

		bool empty() const
		{
			return _con.empty();
		}
	private:
		Container _con;	//底层可以使用 vector/list/deque 容器
	};
}

注意:类模板实例化时,会按需实例化:使用了哪些成员函数,就实例化哪些成员函数(不会全实例化)。


四、STL 标准库中的 queue

1. 底层结构

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

在这里插入图片描述

关于 d e q u e deque deque 的介绍可以看我的这篇博客:【STL】 d e q u e deque deque(了解),仅供了解,这里不过多介绍。

2. 模拟实现

#include <list>
#include<deque>

using namespace std;

namespace ybc
{
	//template<class T, class Con = list<T>>
	template<class T, class Con = deque<T>>
	class queue
	{
	public:
		queue() {}
		
		void push(const T& x) 
		{
			_c.push_back(x);
		}
		
		void pop() 
		{
			_c.pop_front();
		}
		
		T& back() 
		{
			return _c.back();
		}
		
		const T& back() const 
		{
			return _c.back();
		}
		
		T& front() 
		{
			return _c.front();
		}
		
		const T& front() const 
		{
			return _c.front();
		}
		
		size_t size() const 
		{ 
			return _c.size();
		}
		
		bool empty() const 
		{
			return _c.empty();
		}
	private:
		Con _c;
	};
}

总结

以某种既有容器为底部结构将其接口改变,使其符合 “ “ 先进先出 ” ” 的特性,形成一个 q u e u e queue queue,是很容易做到的。 d e q u e deque deque 是双向开口的数据结构,若以 d e q u e deque deque 为底部结构并封闭其底端的出口和前端的入口,便轻而易举地形成了一个 q u e u e queue queue。因此, S G I SGI SGI S T L STL STL 便以 d e q u e deque deque 作为默认情况下的 q u e u e queue queue 底部结构。

由于 q u e u e queue queue 是以底部容器完成其所有工作,而具有这种 “ “ 修改某物接口,形成另一种风貌 ” ” 的性质的,称为 a d a p t e r adapter adapter适配器),因此, S T L STL STL q u e u e queue queue 往往不被归类为 c o n t a i n e r container container容器),而被归类为 c o n t a i n e r   a d a p t e r container\ adapter container adapter容器适配器)。

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

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

相关文章

20250330-傅里叶级数专题之离散时间傅里叶变换(4/6)

4. 傅里叶级数专题之离散时间傅里叶变换 20250328-傅里叶级数专题之数学基础(0/6)-CSDN博客20250330-傅里叶级数专题之傅里叶级数(1/6)-CSDN博客20250330-傅里叶级数专题之傅里叶变换(2/6)-CSDN博客20250330-傅里叶级数专题之离散傅里叶级数(3/6)-CSDN博客20250330-傅里叶级数专…

漏洞挖掘---迅饶科技X2Modbus网关-GetUser信息泄露漏洞

一、迅饶科技 X2Modbus 网关 迅饶科技 X2Modbus 网关是功能强大的协议转换利器。“X” 代表多种不同通信协议&#xff0c;能将近 200 种协议同时转为 Modbus RTU 和 TCP 服务器 。支持 PC、手机端等访问监控&#xff0c;可解决组态软件连接不常见控制设备难题&#xff0c;广泛…

网络安全之前端学习(css篇2)

那么今天我们继续来学习css&#xff0c;预计这一章跟完后&#xff0c;下一章就是终章。然后就会开始js的学习。那么话不多说&#xff0c;我们开始吧。 字体属性 之前讲到了css可以改变字体属性&#xff0c;那么这里来详细讲一讲。 1.1字体颜色 之前讲到了对于字体改变颜色食…

PS底纹教程

1.ctrlshiftU 去色 2.新建纯色层 颜色中性灰&#xff1b;转换为智能对象 3.纯色层打开滤镜&#xff08;滤镜库&#xff09;&#xff1b; 素描下找到半调图案&#xff0c;数值调成大小5对比1&#xff1b; 再新建一层&#xff0c;素描下找到撕边&#xff0c;对比拉到1&#x…

解决pyinstaller GUI打包时无法打包图片问题

当我们的python GuI在开发时。经常会用到图片作为背景&#xff0c;但是在打包后再启动GUI后却发现&#xff1a;原先调试时好端端的背景图片竟然不翼而飞或者直接报错。这说明图片没有被pyinstaller一起打包…… 要解决这个问题很简单&#xff0c;就是更改图片的存储方式。 tk…

蓝桥杯真题------R格式(高精度乘法,高精度加法)

对于高精度乘法和加法的同学可以学学这几个题 高精度乘法 高精度加法 文章目录 题意分析部分解全解 后言 题意 给出一个整数和一个浮点数&#xff0c;求2的整数次幂和这个浮点数相乘的结果最后四舍五入。、 分析 我们可以发现&#xff0c;n的范围是1000,2的1000次方非常大&am…

Nginx — Nginx安装证书模块(配置HTTPS和TCPS)

一、安装和编译证书模块 [rootmaster nginx]# wget https://nginx.org/download/nginx-1.25.3.tar.gz [rootmaster nginx]# tar -zxvf nginx-1.25.3.tar.gz [rootmaster nginx]# cd nginx-1.25.3 [rootmaster nginx]# ./configure --prefix/usr/local/nginx --with-http_stub_…

回调后门基础

回调后门概述 回调后门&#xff08;Reverse Shell&#xff09;是一种常见的攻击方式&#xff0c;攻击者通过受害主机主动连接到远程服务器&#xff08;攻击者控制的机器&#xff09;&#xff0c;从而获得远程控制权限。 工作原理 受害者主机 运行一个恶意代码&#xff0c;尝…

深度学习 Deep Learning 第13章 线性因子模型

深度学习 Deep Learning 第13章 线性因子模型 内容概要 本章深入探讨了线性因子模型&#xff0c;这是一类基于潜在变量的概率模型&#xff0c;用于描述数据的生成过程。这些模型通过简单的线性解码器和噪声项捕捉数据的复杂结构&#xff0c;广泛应用于信号分离、特征提取和数…

【个人笔记】用户注册登录思路及实现 springboot+mybatis+redis

基本思路 获取验证码接口 验证码操作用了com.pig4cloud.plugin的captcha-core这个库。 AccountControl的"/checkCode"接口代码&#xff0c;通过ArithmeticCaptcha生成一张验证码图片&#xff0c;通过text()函数得到验证码的答案保存到变量code&#xff0c;然后把图…

聚类(Clustering)基础知识3

文章目录 一、聚类的性能评价1、聚类性能评价&#xff08;1&#xff09;聚类性能评价方法&#xff1a; 2、参考模型 (reference model)&#xff08;1&#xff09;数据集&#xff1a;&#xff08;2&#xff09;聚类结果&#xff1a;&#xff08;3&#xff09;参考模型&#xff1…

RK3588使用笔记:设置程序/服务开机自启

一、前言 一般将系统用作嵌入式设备时肯定要布置某些程序&#xff0c;这时候就需要对程序设置开机自己&#xff0c;否则每次都要人为启动&#xff0c;当有些嵌入式系统未连接显示屏或者无桌面环境去操作启动程序时&#xff0c;程序自启就是必须的了&#xff0c;本文介绍在纯li…

python实现股票数据可视化

最近在做一个涉及到股票数据清洗及预测的项目&#xff0c;项目中需要用到可视化股票数据这一功能&#xff0c;这里我与大家分享一下股票数据可视化的一些基本方法。 股票数据获取 目前&#xff0c;我已知的使用python来获取股票数据方式有以下三种: 爬虫获取&#xff0c;实现…

JavaScript DOM与元素操作

目录 DOM 树、DOM 对象、元素操作 一、DOM 树与 DOM 对象 二、获取 DOM 元素 1. 基础方法 2. 现代方法&#xff08;ES6&#xff09; 三、修改元素内容 四、修改元素常见属性 1. 标准属性 2. 通用方法 五、通过 style 修改样式 六、通过类名修改样式 1. className 属…

ARM向量表

向量表作用说明RVBAR在 AArch64 中&#xff0c;重置向量不再是异常向量表的一部分。 有复位向量的专用配置输入引脚和寄存器。在 AArch64 中&#xff0c;处理器从 IMPLEMENTAION‑DEFINED 地址开始执行&#xff0c; 该地址由硬件输入引 脚RVBARADDR定义&#xff0c; 可以通过 R…

leetcode刷题日记——除自身以外数组的乘积

[ 题目描述 ]&#xff1a; [ 思路 ]&#xff1a; 题目要求获取数组中每个元素除自己以外的各元素的乘积最简单的方法就是算出数组所有元素的乘积&#xff0c;然后除以自身&#xff0c;即可得到除自身外各元素的乘积 但要考虑到其自身为0的情况&#xff0c;即当期自身为0时&am…

【信奥一本通提高篇】基础算法之贪心算法

原文 https://bbs.fmcraft.top/blog/index.php/archives/22/ 贪心算法 概述 近年来的信息学竞赛试题&#xff0c;经常出现求一个问题的可行解或最优解的题目。这类问题就是我们通常所说的最优化问题。贪心算法是求解这类问题的一种常用算法。在众多的算法中&#xff0c;贪心…

PyQt6实例_批量下载pdf工具_批量pdf网址获取

目录 前置&#xff1a; 步骤&#xff1a; step one 安装包 step two 获取股票代码 step three 敲代码&#xff0c;实现 step four 网址转pdf网址 视频 前置&#xff1a; 1 本系列将以 “PyQt6实例_批量下载pdf工具”开头&#xff0c;放在 【PyQt6实例】 专栏 2 本节讲…

KMeans算法案例

KMeans算法案例 案例介绍 已知&#xff1a;客户性别、年龄、年收入、消费指数 需求&#xff1a;对客户进行分析&#xff0c;找到业务突破口&#xff0c;寻找黄金客户 数据集共包含顾客的数据, 数据共有 4 个特征, 数据共有 200 条。接下来&#xff0c;使用聚类算法对具有相似…

IDApro直接 debug STM32 MCU

使用IDA pro 逆向分析muc 固件的时候&#xff0c; 难免要进行一些动态的debug&#xff0c;来进一步搞清楚一些内存的数据、算法等&#xff0c;这时候使用远程debug 的方式直接在mcu上进行debug 最合适不过了。 不过有个前提条件就是一般来说有的mcu 会被运行中的代码屏蔽 RDP、…