C++ deque详解以及容器适配器

目录

1.容器适配器

2.deque的使用

2.1deque的介绍

2.2deque的缺陷

 2.3deque作为stack和queue的可行性

2.4 deque类的使用

2.4.1deque的构造函数

2.4.2deque容量操作

2.4.3deque赋值,插入


1.容器适配器

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

stack的适配器是deque

queue的适配器和stack一样,也是queue

priority_queue的适配器是vector

根据需要进行的操作的不同,我们会在底层选择不同的适配器,比如stack和queue会进行较多的头删和头插操作,底层使用deque比较方便。

2.deque的使用

2.1deque的介绍

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

 deque的操作图示:

 

 但是deque并不是真正连续的空间,而是由一段段连续的小空间拼接而成的,实际deque类似于一个动态的二维数组,其底层结构如下图所示:

  deque 是由一段一段的定量的连续空间构成。一旦有必要在 deque 前端或者尾端增加新的空间,便配置一段连续定量的空间,串接在 deque 的头端或者尾端。Deque 最大的工作就是维护这些分段连续的内存空间的整体性的假象,并提供随机存取的接口,避开了重新配置空间,复制,释放,代价就是复杂的迭代器架构。

deque 是分段连续内存空间,有中央控制,维持整体连续的假象。中控器中每一个节点都是一个指针,指向真正的缓存区。

 双端队列底层是一段假象的连续空间,实际是分段连续的,为了维护其“整体连续”以及随机访问的假象,落在了deque的迭代器身上,因此deque的迭代器设计就比较复杂,如下图所示:

 对于迭代器:first指向第一个buf的开始last指向第一个buf的结束cur指向buf中的一个数据node指向存储当前buf指针的中控位置

class deque
{iterator start;iterator finish;
}

start指向第一个buf,cur指向这个buf的第一个数据。

finish指向最后一个buf,cur指向这个buf的最后一个数据的下一个位置。


2.2deque的缺陷

与vector比较,deque的优势是:头部插入和删除时,不需要搬移元素,效率特别高,而且在扩容时,也不需要搬移大量的元素,因此其效率是必vector高的。

与list比较,其底层是连续空间,空间利用率比较高,不需要存储额外字段

但是,deque有一个致命缺陷:不适合遍历,因为在遍历时,deque的迭代器要频繁的去检测其是否移动到某段小空间的边界,导致效率低下,而序列式场景中,可能需要经常遍历,因此在实际中,需要线性结构时,大多数情况下优先考虑vector和list,deque的应用并不多,而目前能看到的一个应用就是,STL用其作为stack和queue的底层数据结构。

 2.3deque作为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不仅效率高,而且内存使用率高。结合了deque的优点,而完美的避开了其缺陷

2.4 deque类的使用

2.4.1deque的构造函数

构造说明
deque<T> deqT;默认构造形式
deque(beg, end);构造函数将[beg, end)区间中的元素拷贝给本身
deque(n, elem)构造函数将n个elem拷贝给本身。
deque(const deque &deq)拷贝构造函数

2.4.2deque容量操作

操作说明
deque.size()返回容器中元素的个数
deque.empty()判断容器是否为空
deque.resize(num)重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
deque.resize(num, elem)

重新指定容器的长度为num,若容器变长,则以elem值填充新位置,如果容器变短,则末尾超出容器长度的元素被删除。

2.4.3deque赋值,插入

操作说明
assign(beg, end)将[beg, end)区间中的数据拷贝赋值给本身
assign(n, elem)将n个elem拷贝赋值给本身
deque& operator=(const deque &deq)重载等号操作符
swap(deq)将deq与本身的元素互换
push_back(elem)在容器尾部添加一个数据
pop_back()删除容器最后一个数据
push_front(elem)在容器头部插入一个数据
pop_front()删除容器第一个数据

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

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

相关文章

idea创建一个简单的maven项目

个人学习笔记&#xff08;整理不易&#xff0c;有帮助点个赞&#xff09; 笔记目录&#xff1a;学习笔记目录_pytest和unittest、airtest_weixin_42717928的博客-CSDN博客 添加-DarchetypeCataloginternal 运行参数 (ps:不填的话&#xff0c;maven 骨架生成速度缓慢) 其实我没…

Redis---持久化

Redis是内存数据库&#xff0c;是把数据存储在内存中的&#xff0c;但是内存中的数据不是持久的&#xff0c;如果想要做到持久&#xff0c;那么就需要让redis将数据存储到硬盘上。 Redis持久化有两种策略&#xff1a; RDB > Redis DataBase RDB机制采取的是定期备份AOF …

Java的编程之旅31——多态

1.多态的简介 在Java中&#xff0c;多态是指通过父类的引用调用子类的对象&#xff0c;实现不同类型的对象的方法调用。 Java中的多态通过继承和重写实现。当子类继承父类并重写父类的方法时&#xff0c;可以通过父类的引用调用子类的对象&#xff0c;并且根据运行时实际的类型…

Spring多事务管理器报错处理

报错如下 Description:Field defaultUidGenerator in len.hgy.wsearch.interfaces.search.api.CityController required a single bean, but 2 were found:- transactionManager: defined by method transactionManager in class path resource [org/springframework/boot/aut…

c# ABB 机械手上位机连接

c# 程式开发和调试步骤如下&#xff1a; ABB 机械手要开启PC Interface功能。ABB 机械手设定ip地址。设定测试笔记本和机械手同一网段&#xff0c;用网线直连机械手&#xff0c;也可以通过交换机连接机械手。确保笔记本能够ping通和telnet 机械手80端口都是OK的。以上都OK的话…

QT C++实践|超详细数据库的连接和增删改查操作|附源码

0&#xff1a;前言 &#x1faa7; 什么情况需要数据库? 1 大规模的数据需要处理&#xff08;比如上千上万的数据量&#xff09;2 需要把数据信息存储起来&#xff0c;无论是本地还是服务上&#xff0c;而不是断电后数据信息就消失了。 如果不是上面的原因化&#xff0c;一般…

是谁家的小千金跑出来了?

古典的山树绣花设计 精致典雅&#xff0c;上身立体又轻盈 做了粉绿两色&#xff0c;很适合春天的氛围 春天是个适合外出游玩的季节 穿上这件出游真的超美&#xff0c;日常穿也可 超出片很吸睛&#xff01;

Pytorch学习 day01(Jupyter安装

Jupyter 安装过程中遇到的问题&#xff1a; Anaconda的base环境会自动安装Jupyter&#xff0c;但是如果我们要在其他环境中安装Jupyter&#xff0c;就需要注意&#xff0c;该环境的python版本不能高于3.11&#xff0c;且用以下代码安装&#xff1a; conda install nb_conda_…

齐护ESP32手柄可Arduino编程蓝牙无线游戏手柄Mixly Scratch创客竞赛编程手柄

关于齐护蓝牙手柄 齐护蓝牙手柄&#xff0c;内置蓝牙&#xff0c;专用蓝牙配对码稳定应用&#xff0c;自动无动作后省电休眠&#xff0c;内置锂电池&#xff0c;陀螺仪&#xff0c;双遥杆&#xff08;带按键&#xff09;&#xff0c;及15个多功能按键&#xff0c;人体工艺设计外…

消息中间件之RocketMQ源码分析(二十三)

Broker的关机恢复机制 概述 Broker关机恢复是指恢复CommitLog、Consume Queue、Index File等数据文件。Broker关机分为正常调用命令关机和异常被迫进程终止关机两种情况。恢复过程的设计目标是使正常停止的进程实现零数据丢失&#xff0c;异常停止的进程实现最少量的数据丢失…

Java 数据库面试题解析(中)

10. 事务并发引发的问题&#xff1f;【重点】 脏读&#xff1a;事务A读取了事务B更新的数据&#xff0c;然后B回滚操作&#xff0c;那么A读取到的数据是脏数据。 不可重复读&#xff1a;事务A多次读取同一数据&#xff0c;事务B在事务A多次读取的过程中&#xff0c;对数据作了…

Groovy - 大数据共享搜索配置

数据共享搜索列中配置了搜索列&#xff0c;相应的数据共享接口中也需要支持根据配置的字段搜索&#xff0c;配置实体时&#xff0c;支持搜索的入参code必须是searchKeys&#xff0c;且接口应该是需要支持分页&#xff08;入参必须是 current、pageSize&#xff09;的。current …

Linux系统Docker部署Nexus Maven并实现远程访问本地管理界面

文章目录 1. Docker安装Nexus2. 本地访问Nexus3. Linux安装Cpolar4. 配置Nexus界面公网地址5. 远程访问 Nexus界面6. 固定Nexus公网地址7. 固定地址访问Nexus Nexus是一个仓库管理工具&#xff0c;用于管理和组织软件构建过程中的依赖项和构件。它与Maven密切相关&#xff0c;可…

SpringBoot多数据源配置(MySql、Oracle)

一、依赖 <!-- dynamic-datasource 多数据源--><dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId></dependency><!--oracle驱动--><dependency><groupI…

JavaScript高级程序设计

前言 《JavaScript高级程序设计》 第1章——什么是JavaScript DOM将整个页面抽象为一组分层节点。 BOM用于支持访问和操作浏览器的窗口。 第2章——HTML中的JavaScript 2.1 < script >元素 元素描述async立即开始下载脚本&#xff0c;但不能阻止其他页面动作&#…

深圳智能制造半导体芯片行业源代码防泄密完整解决方案

一、芯片半导体行业防泄密&#xff0c;不能用监控及管控方式来实现&#xff0c;采用管控方式&#xff0c;首先不能主动防御&#xff0c;只能进行事后查询&#xff0c;并且管控方式&#xff0c;不利于嵌入式开发&#xff0c;对于嵌入式开发&#xff0c;不管是采用沙箱隔离或u口禁…

linux查看服务器内核CUP版本相关命令

服务器参考 计算架构&#xff1a;x86-64产品系列&#xff1a;华为云耀云服务器操作系列&#xff1a;CentOS 7 执行uname -a查看服务器内核版本 Linux hecs-82210 3.10.0-1160.92.1.el7.x86_64 #1 SMP Tue Jun 20 11:48:01 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux执行hostn…

Vue动态缓存KeepAlive

vue中keep-alive组件主要有三个常用的props。 1&#xff0c;include存放的name是组件自身的name属性&#xff0c;只有名称匹配的组件会被缓存2&#xff0c;exclude&#xff0c;任何名称匹配的组件都不会被缓存3&#xff0c;max&#xff0c;最多可以缓存多少组件实例&#xff0…

delete误删基表(seg$)bbed恢复cluster table

有客户通过delete误删了sys.seg$表的数据&#xff0c;重启数据库&#xff0c;发现数据库不能正常启动。 删除命令&#xff1a;delete from sys.seg$ t where ts#2; 数据库启动报错 Errors in file /u01/app/diag/rdbms/orcl/orcl/trace/orcl_ora_48064.trc (incident325391)…

【蓝桥杯入门记录】动态数码管例程

目录 &#xff08;1&#xff09;例程1&#xff1a;两个数码管显示不同内容。本例以第一个数码管显示数字“0”&#xff0c;第二个数码管显示数字“1”为例。 &#xff08;2&#xff09;例程2&#xff1a;多个数码管显示不同内容&#xff08;二&#xff09;。注&#xff1a;创建…