【C++】STL之容器适配器——使用deque适配stack和queue

news2024/11/26 23:27:40

在这里插入图片描述

在这里插入图片描述

个人主页:🍝在肯德基吃麻辣烫
分享一句喜欢的话:热烈的火焰,冰封在最沉默的火山深处。


文章目录

  • 前言
  • 一、什么是容器适配器?
    • 二、stack的基本函数和模拟实现
    • 三、queue的基本函数和模拟实现
  • 四、deque
    • 4.1deque的底层结构
    • 4.2使用deque适配stack和queue的原因
  • 总结

前言

本文章主要介绍容器适配器的功能,以及一个适配的场景。


一、什么是容器适配器?

容器适配器,按字面意思理解的话,就是用来对一个容器进行匹配的。在C++STL中,容器有:vector,list,deque,map,set等。

而在C++STL中不把stack和queue纳入容器的范围而是纳入容器适配器的范围是因为:

stack和queue没有下标随机访问等操作,只有普通的pop_front,push_back,pop_back()等操作,而这些函数在其他容器中完全可以有,栈和队列的实现完全可以将其他容器的操作进行复用,这就是stack和queue作为容器适配器的原因。
至于为什么用deque(双端队列)作为stack和queue的默认适配容器,先看一看stack和queue的基本函数使用。

二、stack的基本函数和模拟实现

在这里插入图片描述

在这里插入图片描述可以看到在stl库开放的栈的接口中,仅有寥寥无几的几个接口,主要为:push,pop,size,empty,top。

由于栈的后进先出的特性,

  • 1.push是往栈顶进行push元素。
  • 2.pop是删除栈顶元素。
  • 3.size是计算当前的栈有多少元素
  • 4.empty是判断栈是否为空
  • 5.top是取栈顶元素

这几个函数完全可以复用其他容器的函数。
所以栈其实可以用vector,list等容器进行适配。

下面来模拟实现:

namespace dzt
{
	template<class T, class container = deque<T> >
	class stack
	{
	public:

		void push(const T& x)
		{
			_con.push_back(x);
		}

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

		bool empty()
		{
			return _con.empty();
		}

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

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


	private:
		container _con;
	};
}

为了和库里面的stack不冲突,这里给了一个命名空间域dzt作为限定。

三、queue的基本函数和模拟实现

在这里插入图片描述

在这里插入图片描述
与stack类似,主要的函数有:
push,pop,front,back,size,empty。
由于队列先进先出的特性

  • 1.push,向队列尾部插入元素
  • 2.pop,删除队头元素
  • 3.front,取队头元素
  • 4.back,取队尾元素
  • 5.size,计算当前队列的元素个数
  • 6.empty,判断当前队列是否为空

下面来模拟实现queue

namespace dzt
{

	template<class T, class container = deque<T> >
	class queue
	{
	public:
		void push(const T& x)
		{
			_con.insert(_con.end(),x);
		}
		void pop()
		{
			_con.erase(_con.begin());
		}

		bool empty() const
		{
			return _con.empty();
		}

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

		//取队头
		T& front()
		{
			return _con.front();
		}
		
		//取队尾
		T& back()
		{
			return _con.back();
		}
	private:
		container _con;
	};
}

四、deque

4.1deque的底层结构

deque(双端队列):是一种双开口的"连续"空间的数据结构,双开口的含义是:可以在头尾两端进行插入和删除操作,且时间复杂度为O(1),与vector比较,头插效率高,不需要搬移元素;与list比较,空间利用率比较高。

deque并不是真正连续的空间,而是由一段段连续的小空间拼接而成的,实际deque类似于一个动态的二维数组

deque的底层结构如下:

在这里插入图片描述

  • 1.使用一个中控指针数组来存储各个位置的指针,而存储的位置一般只在数组的中间部分,大多数指针指向的内容都是一小块连续的空间,并且这些连续的空间的大小都是一样的。
    • start(iterator)记录头部数据,finish(iterator)记录尾部数据,头尾的插入删除效率非常高,O(1)。

在这里插入图片描述

  • cur记录指向的连续空间的第一个位置,first和last是该空间的区间,node反指回中控数组,方便找到下一个连续空间。

但是deque也有缺点,虽然它重载了[]访问,但是在访问中间元素时不够极致,需要进行计算。假设给定的下标为i,计算过程如下:

  • 1.i如果在第一个数组的范围,直接访问
  • 2.如果不在,i-=第一个数组的size
  • i/buffersize = 第i个数组的位置
  • 此时i指向了第i个数组,再用i/buffersize = 第i个位置的元素。

相比于vector,deque的下标访问的效率不够高,
相比于list,deque的中间位置插入删除效率不够高。

4.2使用deque适配stack和queue的原因

  • deque作为栈和队列的容器适配器而不是用vector/list的优点:
  • 1.deque的底层结构是使用中控指针数组来存储头和尾等各个空间的地址,对头尾的插入删除效率极高O(1)
  • 2.栈就需要push_back()和pop_back(),队列需要支持pop_front()和push_back() ——— 战胜了vector
  • 3.每一小块空间都是连续的,可以提高cpu高速缓存加载的效率。 ————战胜了list
  • 4.stack和queue都不需要[]随机访问,而deque的缺陷就是下标随机访问的效率不够高
  • 5.这样栈和队列的需求完美迎合了deque的优点,避开了deque的缺点

总结

本篇文章简单讲述了deque容器的底层原理以及相比于vector和list的缺点,还有用deque作为stack和queue的适配器的原因。

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

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

相关文章

如何解决 Git 合并冲突

在遇到合并冲突时&#xff0c;请不要惊慌。通过一些娴熟的技巧协商&#xff0c;你可以解决任何冲突。 假设你和我正在共同编辑同一个名称为 index.html 的文件。我对文件进行了修改&#xff0c;进行了提交&#xff0c;并将更改推送到 Git 远程仓库。你也对同一个文件进行了修改…

K8S初级入门系列之六-控制器(RC/RS/Deployment)

一、前言 在第一章我们了解到&#xff0c;如果master节点是一个大脑&#xff0c;那么控制器组件就是大脑的总管&#xff0c;用来控制Pod的状态和行为。今天我们就来认识弹性扩缩容相关的控制器ReplicationController&#xff0c;ReplicaSet&#xff0c;Deployment。 二、Repli…

(汽车MCU)FS32K148UJT0VLLT、FS32K148HAT0MLLT、FS32K148UJT0VLUT基于32位Cortex-M4F内核 架构图

S32K 32位汽车通用微控制器 (MCU) 是一系列符合AEC-Q100标准、基于32位ARM Cortex-M4F内核的可扩展MCU&#xff0c;适用于通用汽车和高可靠性工业应用。这些系列提供具有可扩展性的软硬件兼容系列&#xff0c;有多种性能、存储器和特性可供选择。这些MCU提供ISO、CAN FD、CSEc硬…

如何使用curl下载github代码

首先通过chrome打开想要下载的源文件 如图&#xff0c;有那个下载图标时表示不需要鉴权即可下载&#xff0c;一般仓库都会开放只读权限&#xff0c;所以很大概率都有 比如我想下载这个crc32.c文件 那么我就需要知道它在哪个IP中&#xff0c;按下F12打开网络&#xff0c;点击下载…

qt学习——QMainWindow、基本控件

初识qt **QMainWindow——菜单栏和工具栏****状态栏、铆接部件、核心部件****资源文件得添加****模态和非模态对话框创建****消息对话框****其它标准对话框****登录窗口布局****控件按钮组****QListWidget控件****QTreeWidget树控件****QTableWidget控件****其他常用控件介绍**…

踩坑_vertical-align

目录 问题&#xff1a;vertical-align属性语法父元素的基线怎么找呢&#xff1f;特殊元素的基线行盒 解决 问题&#xff1a; 今天在做一个需求时遇到了如下问题&#xff1a; 代码 <style>*{margin:0;padding:0;}#app{width: 300px;height: 117px;background: #FFFFFF;bo…

验证回文串(力扣)双指针 JAVA

如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后&#xff0c;短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。 字母和数字都属于字母数字字符。 给你一个字符串 s&#xff0c;如果它是 回文串 &#xff0c;返回 true &#xff1b;否则&#xf…

访客报警定位管理系统:提升安全管理水平的创新解决方案

在当前日益复杂的安全环境下&#xff0c;保障人员安全、提高安全响应能力和管理效率成为了各行各业的首要任务。 作为一种先进的安全管理解决方案&#xff0c;访客报警定位管理系统凭借其独特的优势和广泛的应用场景&#xff0c;正逐渐成为各行业安全管理的重要工具。 那么&a…

web前端设计师的主要职责说明(合集)

web前端设计师的主要职责说明1 职责&#xff1a; 1. 根据UI设计师提供的设计图&#xff0c;实现一流的Web界面&#xff0c;优化代码并保持在各浏览器下良好的兼容性; 2. Web前端表现层及与后端交互的架构设计和开发; 3. JavaScript程序模块开发&#xff0c;通用类库、框架编…

树莓派 使用 docker安装showdoc

最近在使用showdoc时感觉挺方便的&#xff0c;但是在树莓派上拉取showdoc对应的镜像时特别慢&#xff0c;熬了一天半发现镜像倒在了最后一步&#xff0c;重试了好几次都没有拉去下来。后来仔细阅读了官网操作文档再加一点小运气今天成功给安装成功了。 showdoc的安装环境&…

【本地电脑搭建Web服务器并用cpolar发布至公网

本地电脑搭建Web服务器并用cpolar发布至公网访问 随着互联网的快速发展&#xff0c;网络也成为我们生活中不可缺少的必要条件&#xff0c;为了能在互联网世界中有自己的一片天地&#xff0c;建立一个属于自己的网页就成为很多人的选择。但互联网行业作为资本密集的行业&#x…

企业网络安全合规框架体系

云安全联盟大中华区发布报告《企业网络安全合规框架体系》&#xff08;以下简称报告&#xff09;&#xff0c;该报告对典型业务场景给出了参考实例&#xff0c;供广大甲方单位、集成商、咨询机构参考。 近些年&#xff0c;随着国内网络安全领域相关法律、法规、政策文件、标准规…

Seata部署(Centos和Docker)

一、简介 Seata 是一款开源的分布式事务框架。致力于在微服务架构下提供高性能和简单易用的分布式事务服 务。在 Seata 开源之前&#xff0c;Seata 对应的内部版本在阿里经济体内部一直扮演着分布式一致性中间件的⻆ 色&#xff0c;帮助经济体平稳的度过历年的双11&#xff0c…

Unity+chatgpt+webgl实现声音录制+语音识别

一、前言 AI二次元女友这个项目持续更新&#xff0c;在window端的语音识别和语音合成的功能&#xff0c;在上一篇博文里已经详细说明了微软Azure语音服务的代码实现。也是为了实现一次代码&#xff0c;多端复用这样的诉求&#xff0c;所以全部的代码实现都改成了web api的方式…

openSUSE leap 15.3安装mysql-community-server

openSUSE Software 下载"https://software.opensuse.org/ymp/home:bjoernv/15.3/mysql-community-server.ymp" wget "https://software.opensuse.org/ymp/home:bjoernv/15.3/mysql-community-server.ymp" 双击"mysql-community-server.ymp" 添…

Flutter Windows通过嵌入Native窗口实现渲染视频

Flutter视频渲染系列 第一章 Android使用Texture渲染视频 第二章 Windows使用Texture渲染视频 第三章 Linux使用Texture渲染视频 第四章 全平台FFICustomPainter渲染视频 第五章 Windows使用Native窗口渲染视频&#xff08;本章&#xff09; 文章目录 Flutter视频渲染系列前言…

FPGA XDMA 中断模式实现 PCIE3.0 QT上位机图片传输 提供工程源码和QT上位机源码

目录 1、前言2、我已有的PCIE方案3、PCIE理论4、总体设计思路和方案图像产生、发送、缓存XDMA简介XDMA中断模式图像读取、输出、显示QT上位机及其源码 5、vivado工程详解6、上板调试验证7、福利&#xff1a;工程代码的获取 1、前言 PCIE&#xff08;PCI Express&#xff09;采…

【深度学习之YOLO8】环境部署

目录 一、确定版本CUDA toolkit、cuDNN版本Python、PyTorch版本 二、安装Python下载环境变量验证安装 三、安装Anaconda安装环境变量验证安装创建conda虚拟环境常用命令 四、安装CUDA toolkit下载环境变量验证安装 五、配置cuDNN下载 六、安装PyTorch(torchtorchversiontorchau…

JavaWeb课程设计项目实战(05)——项目编码实践2

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 在本节教程中&#xff0c;我们完成项目的登录功能。 User 请在bean包中创建User类&#xff0c;代码如下&#xff1a; package com.cn.bean; /*** 本文作者&#xff1a;谷…

离线安装mysql8

一、先前往官网下载mysql8 下载地址&#xff1a; https://dev.mysql.com/downloads/ 选择Linux 二、删除Linux中的mysql&#xff08;如果有的话&#xff09;&#xff0c;上传安装包 1、先查看mysql是否存在&#xff0c;命令如下&#xff1a; rpm -qa|grep -i mysql 如果使用…