【C++】STL中stack,queue容器适配器的模拟实现(使用deque容器)

news2024/9/28 10:27:08

文章目录

  • 前言
  • 一、deque的一些基本知识
    • 相比vector:
    • 相比list:
    • 3为什么选择deque作为stack和queue的底层默认容器
  • 二、stack模拟实现
  • 三、queue的模拟实现


前言

STL标准库中stack和queue的底层结构 :

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

一、deque的一些基本知识

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

在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述

相比vector:

1.极大缓解了扩容问题以及头插头删问题
2.deque的下标访问不够极致,遇上遍历的时候要拉跨很多
3.deque的迭代器要频繁的去检测其是否移动到某段小空间的边界,导致效率低下

相比list:

1.可以支持下标访问
2.cpu高速缓存效率不错
3.和list一样头插头删效率可以,但中间插入删除效率很拉跨

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

  1. stack和queue不需要遍历(因此stack和queue没有迭代器),只需要在固定的一端或者两端进行操作。

  2. 在stack中元素增长时,deque比vector的效率高(扩容时不需要搬移大量数据);queue中的元素增长时,deque不仅效率高,而且内存使用率高

高频的头插头删,尾插尾删很合适

二、stack模拟实现

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


	private:
		Container _con;
	};
}

三、queue的模拟实现

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

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

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

相关文章

vue的组件化编程的详细讲解加代码演示

&#x1f600;前言 本片文章是vue系列第5篇整理了vue的组件化编程的详细讲解加代码演示 &#x1f3e0;个人主页&#xff1a;尘觉主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是尘觉&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是我的动力&am…

leetcode 53. 最大子数组和

2023.7.28 要求找最大和的 连续子数组&#xff0c; 我的思路是用一个temp记录局部最优值&#xff0c;用ans记录全局最优值。 然后在每次for循环进行一个判断&#xff1a;当前遍历元素temp值 是否大于当前遍历元素的值&#xff0c;如果大于&#xff0c;说明temp值是帮了正忙的&a…

第12章 Linux 实操篇-Linux磁盘分区、挂载

12.1 Linux 分区 12.1.1 原理介绍 (1) Linux来说无论有几个分区&#xff0c;分给哪一目录使用,它归根结底就只有一个根目录&#xff0c;一个独立且唯一的文件结构, Linux中每个分区都是用来组成整个文件系统的一部分。 (2) Linux采用了一种叫“载入”的处理方法&#xff0c;…

临床医学怎样翻译比较 好

近年来&#xff0c;随着不同国家之间医药行业形成的共同研究趋势&#xff0c;临床翻译对于来自不同国家的医疗人员的合作至关重要。那么&#xff0c;临床医学怎样翻译比较 好&#xff0c;北京哪个翻译公司比较专业&#xff1f; 据了解&#xff0c;临床医学翻译包含患者病历记录…

selenium自动化-获取元素属性信息

在写自动化过程中我们会想验证自己的代码是否正确&#xff0c;比如登录之后&#xff0c;通过用户名或其他信息来证明你登录成功&#xff0c;或者点击链接后&#xff0c;是否会跳转新的页面。通过获取元素属性信息&#xff0c;可以解决我们的疑惑。 一、获取内容对象的内容信息 …

专题-【排序比较】

时间最好&#xff1a;直接和冒泡&#xff0c;n 堆排序和归并时间固定&#xff1a;nlog2n 空间&#xff1a;归并&#xff0c;n&#xff1b;快速&#xff0c;log2n 稳定&#xff1a;直冒归基

Spring 6【Resources资源和资源加载】(九)-全面详解(学习总结---从入门到深化)

目录 Resources资源和资源加载 Resources资源和资源加载 1.为什么要讲解Resources 在Java中 java.net.URL类是统一资源定位符的抽象&#xff0c;主要用于描述互联网上资源的一个字符串。一般语 法为&#xff1a; scheme:[//authority]path[?query][#fragment] 例如&#…

JavaScript学习 -- HMAC算法基本原理

HMAC&#xff08;Hash-based Message Authentication Code&#xff09;算法是一种基于哈希算法的消息认证码算法。它可以用于验证和保护数据在传输过程中的完整性和真实性。在JavaScript中&#xff0c;我们可以使用HMAC算法来保证数据的安全性。本篇文章将介绍HMAC算法的基本原…

超详细三子棋(保姆级教学)

超详细三子棋&#xff08;保姆级教学&#xff09; 一、模块化程序设计&#xff08;多文件编程&#xff09;介绍1.概述2.传统编程的方式3.模块化程序设计的方法二、三子棋(含多子棋)代码设计思路三、三子棋代码设计1.创建菜单函数2.实现多子棋3.棋盘初始化4.打印棋盘格式5.玩家下…

使用express搭建后端服务

目录 1 创建工程目录2 初始化3 安装express依赖4 启动服务5 访问服务总结 上一篇我们利用TDesign搭建了前端服务&#xff0c;现在的开发讲究一个前后端分离&#xff0c;后端的话需要单独搭建服务。后端服务的技术栈还挺多&#xff0c;有java、php、python、nodejs等。在众多的技…

hbase(1)-基础

1、hbase产生背景 hadoop只能执行批量处理&#xff0c;并且只能以顺序方式访问数据&#xff0c;这意味着即使最简单的搜索工作&#xff0c;也必须搜索整个数据集。那么当处理一个庞大的数据集&#xff0c;也是按照顺序处理一个巨大的数据集。 基于上述hadoop的限制&#xff0…

股东分红税高达20%,该怎么节税?

股东分红税高达20%&#xff0c;该怎么节税&#xff1f; 别吃大亏了!股东分红个税高达20%&#xff0c;这样做节税很实在&#xff01; 《税筹顾问》专注于园区招商、企业税务筹划&#xff0c;合理合规助力企业节税&#xff01; 企业成立的初衷就是为了赚钱&#xff0c;以盈利为…

ts中声明引入未使用的报错——解决方案

在编写ts项目的时候&#xff0c;经常会出现如下报错&#xff1a; 导入声明中的所有导入都未使用 这是因为导入的模块暂时没有使用&#xff0c;ts给的一个提示信息 解决方案&#xff1a; 在ts.config.json中 把noUnusedLocals 设置为false即可 {"compilerOptions"…

进阶 vue自定义指令 vue中常用自定义指令以及应用场景,案例书写

文章目录 vue3自定义指令1.什么是自定义指令&#xff1f;2.注册自定义指令2.1 全局注册2.2 局部注册<script setup>中注册&#xff1a;<script>中使用&#xff1a; 3.钩子函数参数详解4.指令传值5.总结 常用自定义指令案例v-longpress 长按v-debounce 防抖v-thrott…

微信怎么实现自动通过好友请求后自动回复呢?

每天都很忙碌 今天特别忙“录” 每天打开微信后&#xff0c; 第一件事就是回复客户&#xff0c; 但是经过一个小时、两个小时后发现&#xff0c; 只回复了昨晚留言的那一批客户&#xff0c; 还没有来得及回复刚刚发来的信息。 此外&#xff0c;通讯录中有99个客户等待手动…

代理模式-对象的间接访问

现在朋友圈有好多做香港代购的微商&#xff0c;大部分网民无法自己去香港购买想要的商品&#xff0c;于是委托这些微商&#xff0c;告诉他们想要的商品&#xff0c;让他们帮我们购买。我们只需要付钱给他们&#xff0c;他们就会去香港购买&#xff0c;然后把商品寄给我们。这就…

测试常见前端bug

目录 协作 测试方法 标签&#xff1a;标签 内容/ref/ 判断 arr&&arr.length 交互 样式不生效&#xff1a;devtools查找&#xff0c;编译前的标签&#xff0c;运行时不一定存在 可交互的需要提示 hover样式 没有交互逻辑&#xff0c;就不要设置交互 无法交互…

pytorch学习——模型选择

一.概念 模型选择是机器学习中的重要环节&#xff0c;它涉及到从各种统计&#xff0c;机器学习或深度学习模型中选取最佳模型的过程。这涉及到许多关键概念&#xff0c;包括偏差与方差&#xff0c;过拟合与欠拟合&#xff0c;训练误差和泛化误差&#xff0c;交叉验证&#xff0…

【Linux下6818开发板(ARM)】硬件空间挂载

(꒪ꇴ꒪ ),hello我是祐言博客主页&#xff1a;C语言基础,Linux基础,软件配置领域博主&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff01;送给读者的一句鸡汤&#x1f914;&#xff1a;集中起来的意志可以击穿顽石!作者水平很有限&#xff0c;如果发现错误&#x…

HTML基础知识点总结

目录 1.HTML简介 2.HTML基础结构 主要字符&#xff1a; 3.基础知识 &#xff08;一&#xff09;p标签 &#xff08;二&#xff09;hr标签 &#xff08;三&#xff09;尖角号 &#xff08;四&#xff09;版权号 (五)div和span div span (六)列表 &#xff08;1&…