【STL】容器适配器

news2024/10/1 1:19:07

 放在专栏【C++知识总结】,会持续更新,期待支持


1、什么是适配器?

我们生活中就存在大量的适配器,最常见的莫过于我们常见的电源适配器,它的作用就是将交流电源转化为直流电源进行输出,可以说电源适配器在电流转换之间扮演着一个轴承、转换器的角色。

1.1、适配器概念

适配器(也称之为配接器adapter)作为STL的六大组件之一,在STL中同样扮演轴承、转换器的角色。adapter这个概念实际上是一种设计模式:将一个class的接口转化为另一个class的接口,使原本因接口不兼容而不能合作的classes可以一起合作。

就比如马上就要讲的,stack的相关操作底层实际上是调用了deque的对应的函数接口,或者queue的相关操作我们也可以实现成在底层调用list的对应的接口。具有这种将一个类的接口转化成客户想要的另一个类的接口的性质的,我们称之为适配器(配接器)。

2、STL中的适配器

2.1、适配器分类

在STL所提供的各种适配器中,改变仿函数接口者,我们称之为函数适配器(function adapter);改变容器接口者称之为:容器适配器(container adapter);改变迭代器接口者,称之为迭代器适配器(iterator adapter)。本章我们讲的主要是容器适配器。

2.2、stack

2.2.1、stack介绍

stack是一种先进后出(FILO -> First In Last Out)的数据结构,只具有一个出入口,如下图所示:

 我们查阅文档就可以发现,stack是以deque作为其底层容器,也就是说,stack的push、pop、top等相关操作,其实底层都是调用的deque的相关接口,这也是为什么stack被归类为适配器而非容器的原因所在。至于为何采用deque作为其底层容器,本文后面会进行讲解。

2.2.2、stack使用

在使用时,我们平常并不需要修改其底层容器,只需传一个模板参数类型即可,使用时需包含头文件<stack>。如下所示:

 当然,我们也可以更换其底层容器,不过有一点需要注意的是,作为栈的底层容器必须要支持以下几个操作:

  • empty        : 判空
  • size            :有效元素个数
  • back           :尾部元素
  • push_back :尾插
  • pop_back   :尾删

因此,诸如vector、list都可以作为其底层容器:

stack的常用接口也非常的少,基本上常用的就是以上我所讲的一些。接下来我们来模拟实现一个stack。

2.2.3、stack的模拟实现

这里我们也可以按库中那样,默认以deque作为其底层容器来实现,不过这里我们换一个底层容器,用vector来实现,模拟实现也很简单,全都是用底层容器的接口来完成:

2.3、queue

2.3.1、queue的介绍

queue也是默认以deque作为其底层容器,我们平常在使用时,直接传一个模板参数T即可,当然我们也可以修改其底层容器,不过要作为queue的底层容器,必须要具有以下几个接口:

  • empty         :判断是否空
  • size            :有效元素个数
  • front           :获取头部元素
  • back           :获取尾部元素
  • push_back :尾插
  • pop_front    :头删

queue是一个先进先出(FIFO,First In Firet Out)的数据结构,其从一端插入元素,从另一端删除元素。

2.3.2、queue的使用

 queue的使用也很简单,在使用之前要包含头文件<queue>:

 2.3.3、queue的模拟实现

这里我们来模拟一个以list为底层容器的链式队列,queue的接口底层通通调用list对应的接口来实现:

 3、deque双端队列(了解即可)

3.1、deque介绍

deque是一个双端队列,可以实现在头尾两端的相关操作,并且在头尾两端的操作十分高效。与vector相比,vector虽然也可以实现在头部的操作,但实现起来比较复杂,要挪动后面的所有元素,而与list相比,由于其底层空间是连续空间,所以空间利用率要高于list,并且list不支持下标的随机访问,而deque则支持。

因此,可以说deque是集合了list与vector各自的优点(头尾高效操作+随机访问元素),但是自古以来鱼与熊掌不可兼得,deque虽集合了各自的优点,但是却做不到vector与list那么极致。deque的数据结构较为复杂,尤其是其迭代器。不过作为一个容器适配器来说,我们仅仅需要其头尾两端/或者一端的中间的插入删除相关操作。接下来我们来看一下它的结构。

3.2、deque的结构

3.2.1、deque的基本介绍

 如上图所示,deque采用map作为主控,这里的map并非STL容器中的map,这里的map是一小块连续的空间,每个元素都是一个指针(数组指针),该指针指向了一块缓冲区,这里的缓冲区用来deque存储数据。(有点类似于二维数组vector<vector<T>>)。

3.2.2、deque的迭代器

deque的迭代器设计十分复杂,如下所示:

 这里迭代器中的node指向中控器中的node节点,其first与last分别指向node指向的缓冲区的起始位置以及最后一个位置,cur则指向当前所在缓冲区的位置,++或者--进行对缓冲区内的数据遍历,当cur指针指向last位置时,此时的++或--则是指向中控器中的下一个node节点。因此我们看到deque的结构确实复杂,其遍历操作效率低下,因为每一次的++或--操作,都要检测迭代器是否指向缓冲区的两端。

3.2.3、deque的扩容机制

相比于vector,vector的扩容是分为3步走,开辟更大一块空间->将原空间数据进行拷贝->释放原有空间,这里的拷贝如果vector存储的是自定义类型,其中还要涉及深拷贝,而deque由于其中控器中存储的都是一个个的指针,因此在扩容时,仅仅只需要将其数组指针进行拷贝,这里就不存在深拷贝的问题,因为指针是内置类型,内置类型在拷贝时是值拷贝(浅),因此deque的扩容要比vector高效的多。

3.2.4、deque的随机访问

deque虽然支持随机访问,但是其效率也是不如vector的,这里假如我们第一个缓冲区已经存在了3个数据,且每一个缓冲区的大小固定为10,这里我们要想实现访问第25个数据,在vector中则只需要vector[24]即可访问到该数据,而在deque中则需要:1、先找到其所在的缓冲区。2、再找到在缓冲区的第几个位置。

这里则是(25-3)/10:找到在第几个缓冲区,(25-3)%10,找到其在缓冲区的第几个位置。我们可以看到,缓冲区的大小会影响其随机访问的效率,所以在SGI版本下,为了提高随机访问的效率,其缓冲区的大小都是固定不变的。

 3.2.5、为什么采用deque作为stack与queue的默认底层容器?

这是因为对于stack来说,只要具有尾部操作的容器都可以作为其底层容器,比如list与vector,而queue只要具有头尾两端相关操作的容器,都可以作为其底层容器,诸如list。但是这里为何要采用deque呢?因为首先,deque的两端操作都很高效,达到了O(1)的时间复杂度,再接着deque的扩容也要比vector更加高效,并且空间由于是连续的,所以空间利用率要高于list。虽然说deque的遍历,以及在中间位置相关操作的效率不如list与vector,但是stack与queue并不需要遍历的相关操作,也不需要在中间位置插入删除,仅仅只需要其两端操作。所以deque作为其默认底层容器,完美的避开了deque的所有缺点,而又很好的利用了其优点。


end.

生活原本沉闷,但跑起来就会有风!🌹

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

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

相关文章

618复盘:爆款存当下,蓝海寄未来

价格&#xff0c;贵必赔。优惠&#xff0c;直接减。 号称史上最内卷的一届618在一家又一家号称史上最大补贴的狂欢下&#xff0c;落幕得悄无声息&#xff0c;各大平台默契地都没有公布具体GMV。 这样的结局似乎已有预见。此前有媒体援引浙江大学经济学院教授叶建亮的说法&…

从小白到大神之路之学习运维第47天---第三阶段----Iptables、路由表的配置、Linux下创建虚拟IP

第三阶段基础 时 间&#xff1a;2023年6月26日 参加人&#xff1a;全班人员 内 容&#xff1a; Iptables、路由表的配置、Linux下创建虚拟IP 目录 Iptables 1. 查看 iptables 设置&#xff1a; 2. 开启全部流量&#xff1a; 3. 关闭全部流量&#xff1a; 4. 允许某…

【Jmeter教程】_事务控制器

目录 一、添加事务控制器 二、事务控制器参数说明 三、运用事务控制器 统计性能测试结果一定会关注TPS&#xff0c;TPS表示每秒处理事务数&#xff0c;JMeter默认每个事务对应一个请求。我们可以用逻辑控制器中的事务控制器将多个请求统计为一个事务。 一、添加事务控制器 …

分享 5 个你可能不知道的前端小技巧

大家都知道&#xff0c;如今前端开发是一个充满活力的领域&#xff0c;每天都会涌现出新的技术和最佳实践。 作为前端开发人员&#xff0c;如果你真的想创建引人入胜、直观且响应迅速的用户界面&#xff0c;就必须时刻跟进最新的趋势和技术。 作为前端开发人员&#xff0c;我们…

不止10倍提速!PCIe EtherCAT实时运动控制卡XPCIE1032H 等您评测!

在高速高精运动控制领域&#xff0c;数据交互的快慢对产线的生产效率起着重要作用。提升数据交互速度能够实时地接收和处理大量的传感器监控运行数据、运动指令和反馈信息&#xff0c;从而实现更精确的运动控制、速度调整和轨迹规划&#xff0c;进而提高系统的响应时间和稳定性…

LDR6023C 专门为USB-C接口无线领夹式麦克风方案打造

推出领夹式无线麦克风方案&#xff0c;专门为USB-C接口手机打造&#xff0c;兼容性非常的游戏&#xff0c;可让手机同时一边充电一边传输数据。 随着直播平台的兴起&#xff0c;网络直播越来越火&#xff0c; 领夹式直播麦克风得到广泛应用&#xff0c; 现在手机&#xff0c;电…

海睿思分享 | 浅谈企业数据质量问题

一、数据质量问题场景 在日常工作中&#xff0c;业务领导经常通过BI系统来了解各项业务的业绩情况。倘若某天&#xff0c;他打开某张核心报表&#xff0c;发现当日某个区域的数据一直是空白的。BI开发人员经过几个小时的排查分析&#xff0c;发现是当日该区域的销售数据存在产…

VsCode 安装Copilot

1&#xff0c;插件安装 &#xff08;1&#xff09;首先我们在 VSCode 里面搜索并安装 Copilot 插件&#xff1a; &#xff08;2&#xff09;安装后编辑器右下角会出现一个小机器人图标&#xff0c;并且提示我们需要登录 GitHub 账号&#xff1a; 此时需要科学 目前要收费劝退…

增值税高如何解决?有哪些注意事项?

增值税高如何解决&#xff1f;有哪些注意事项&#xff1f; 《税筹顾问》专注于园区招商、企业税务筹划&#xff0c;合理合规助力企业节税&#xff01; 咦&#xff0c;增值税高了怎么办&#xff1f;这可是个大问题啊&#xff01;特别是对于那些经济效益还不错的企业来说&#x…

【Leetcode60天带刷】day37——968. 监控二叉树

​ 题目&#xff1a; 968. 监控二叉树 给定一个二叉树&#xff0c;我们在树的节点上安装摄像头。 节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。 计算监控树的所有节点所需的最小摄像头数量。 示例 1&#xff1a; 输入&#xff1a;[0,0,null,0,0] 输出&#…

校园外卖行业内卷之下,高校外卖创业者如何成为卷王?

伴随着外卖行业的不断发展&#xff0c;校园市场前景广阔。校园外卖市场因各大平台的竞争而变得越来越复杂。各种技术支持和经验参考让大学生创业校园外卖越来越困难&#xff0c;市场竞争也越来越激烈。 校园外卖市场究竟有多内卷&#xff1f; 外卖龙头企业。 校园市场广阔的发…

抖音seo矩阵系统:源码编写及优化策略

开发概述 抖音作为一款流行的短视频分享平台&#xff0c;其搜索引擎优化&#xff08;SEO&#xff09;的重要性日益凸显。为了提升抖音账号的曝光率和用户粘性&#xff0c;开发一套抖音SEO矩阵系统源码成为了必不可少的一步。 在编写抖音SEO矩阵系统源码时&#xff0c;需要首先…

企业缺成本票怎么办?

企业缺成本票怎么办&#xff1f; 《税筹顾问》专注于园区招商、企业税务筹划&#xff0c;合理合规助力企业节税&#xff01; 企业缺成本发票的原因基本都是一样的&#xff0c;不外乎以下这几种&#xff1a; 1&#xff0e;企业类型自身缺陷&#xff1a;成本费用以人员工资、提…

父元素设置max-height,子元素高度设置百分比,子元素继承父元素高度失败

需求描述&#xff1a; 小程序里碰到的&#xff0c;最外层page高度 100%&#xff0c;里边第一层盒子高度为 max-height: 60%; 第一层盒子里有 title&#xff0c;content&#xff0c;这个 content 高度要随着第一层盒子高度走&#xff0c;最高为第一层盒子的高度减去 title 的高…

金属元素螯合剂:1023889-20-4,(S)-DOTAGA-(COOt-Bu)4,水溶性好、稳定性好

●中文名&#xff1a;(S)-DOTAGA-四叔丁酯 ●英文名&#xff1a;(S)-DOTAGA-(COOt-Bu)4 ●外观以及性质&#xff1a; (S)-DOTAGA-(COOt-Bu)4中DOTA是一种十二元四氮杂大环配体的金属元素螯合剂&#xff0c;该化合物还可作为一种水溶性好、稳定性好的离子液体的配体。此外&…

it个人工作总结范文10篇

it个人工作总结1 20-年这一年中&#xff0c;在公司领导的正确领导及对公司信息化建设高度重视下&#xff0c;经过IT部门全员长期努力&#xff0c;公司信息化工作取得了明显的成效。现将20-年IT部工作总结如下&#xff1a; 第一部分&#xff1a;取得的成绩 (一)建立华凯尔协同工…

光伏行业快速发展与分布式光伏云平台的设计

安科瑞虞佳豪 ​近年来&#xff0c;我国光伏产业实现快速发展&#xff0c;成为我国取得全球竞争优势、实现端到端安全可控、有望率先成为高质量发展典范的新兴产业之一。阳光电源股份有限公司董事长曹仁贤表示&#xff0c;目前我国光伏产业已形成全球最完整的产业链&#xff0c…

民用飞机飞控系统传感器故障诊断研究综述

导语 飞控系统中的各类传感器对飞机稳定与操纵起着至关重要的影响&#xff0c;是飞机的重要安全机载设备之一。传统冗余方法具有“安全性高&#xff0c;经济性低”的特点&#xff0c;通过多余度设计来提升系统的安全性给飞机的重量与结构设计、系统综合集成、维修与检测成本都…

Axure教程—中继器分页

本文是关于Axure中继器的运用操作&#xff0c;详细讲解利用Axure中继器实分页的操作流程&#xff0c;比较基础&#xff0c;供初学者参考学习。 效果 预览地址&#xff1a;https://hd42dm.axshare.com 功能 1、点击“数字”显示相应页面的内容 2、点击“首页”显示第一页内容 …

测试找工作,如今真的一年比一年难,怎样才能打破困境?

坐标深圳&#xff0c;2020年6月毕业开启了社畜的模式&#xff0c;深圳某大型互联网码农集散基地&#xff08;非大厂&#xff09;学历背景&#xff1a;二本。 第一份工作在深圳的一个60人左右规模的小公司做软件测试。年初离职后&#xff0c;最近刚刚跳槽成功。 做测试是从20年…