STL deque 源码——deque特点、实现框架、源码分段剖析、常用函数总结(上)

2023-11-18

一、deque的一些特点

  1. 支持随机访问,即支持[ ]以及at(),但是性能没有vector好
  2. 可以在内部进行插入和删除操作,但性能不及list
  3. deque 两端 都能够快速插入和删除元素,而vector只能在尾端进行。
  4. deque的元素存取和迭代器操作会稍微慢一些,因为deque的内部结构会多一个间接过程
  5. deque迭代器是特殊的智能指针,而不是一般指针,它需要在不同的区块之间跳转
  6. deque可以包含更多的元素,其max_size可能更大,因为不止使用一块内存
  7. deque不支持对容量和内存分配时机的控制。(?)
  8. 在除了首尾两端的其他地方插入和删除元素**,都将会导致指向deque元素的任何pointers、references、iterators失效**。但,deque的内存重分配优于vector,因为其内部结构显示不需要复制所有元素。
  9. deque的内存区块不再被使用时,会被释放,deque的内存大小是可缩减的。不过,是不是这么做以及怎么做由实际操作版本定义。
  10. deque 不提供容量操作:capacity()和reverse(),但是vector可以

二、deque实现框架

直接用侯捷老师的deque底层示意图说明其数据结构吧,
在这里插入图片描述
结合上述的特点我们就能明白deque的线性空间其实是一个假象,真实的底层是用一个map主管来管理每一小块连续内存的地址,是一种分段连续的存储空间, 因此迭代器需要在不同区块之间跳转,也就造成了随机访问和内部插入删除比不上vector和list。

ok, 开始deque的设计框架

1, 从图片可知基本信息

从上述分析我们知道了deque容器采用一种分段式存储空间,那么支持随机访问的deque就需要对迭代器进行处理,从图我们就知道的是:
1,首先我们要保证每一个小连续内存的容量(缓冲区容量)都是一样的;

2,需要两个迭代器,startfinish,分别指向第一个有效的map节点及其缓冲区,和最后一个有效的map节点及对应缓冲区,依旧是严格的STL原则左闭右开

3,最重要的一点,start和finish对应的缓冲区的空或满判断是不一样的,每一个缓冲区都有三个指针firstcurlast,开头缓冲区start满了是start.cur == start.first,空了是start.cur == start. last, 而finish缓冲区对应的就是我们下意识的状态, 满了就是finish.cur == finish.last

4,当然还有管理中心map

2,deque框架代码

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STL deque 源码——deque特点、实现框架、源码分段剖析、常用函数总结(上) 的相关文章

随机推荐

  • windows10下安装kali子系统

    写在前面 为什么我会想到在窗下装一个卡利 作为一个小白 平时做CTF题的时候 有时会用到python2 7环境 比如一些脚本需要 还有窗户下用的SqlMap的话 好像只支持在python2 7 之前被这个坑了好久 想用它的时候突然发现我的S
  • 个人三年规划建议

    一 前言 最近在 编程导航 有位鱼友的关于职业规划的提问 对于刚进入职场的新人来说 是很常见的问题 下面我分享出来 也希望能帮助到刚进入职场的同学们 在面对未来规划的时候 也有些参考 我的建议不一定适合每一位同学 但有些共性的东西是通的 我
  • innerHTML与XSS攻击

    HTML5为所有元素提供了一个innerHTML属性 既能获取对象的内容又能向对象插入内容 属性值 HTML标签 文本 浏览器会将属性值解析为相应的DOM树 HTML解析器在浏览器中是底层代码比JavaScript方法快很多 同时意味着替换
  • C++新特性03_迭代器iterator及类型推导auto(迭代器:用于容器中数据遍历;动态数组(vector)和链表(list)遍历;堆上下限标志位;类型推导auto:编译时自动推导数据类型)

    迭代器iterator及类型推导auto 1 迭代器 用于容器中数据的遍历操作 1 1 普通数组与动态数组定义及遍历方式 1 1 1 数组 普通的数组 一旦申请 不能再扩增 1 1 2 动态数组 vector 不用指定其大小 会根据数组当前
  • mybatis级联查询

    用户表 CREATE TABLE sys user userid varchar 50 NOT NULL roleid int 11 NOT NULL username varchar 50 DEFAULT NULL COMMENT 用户名
  • go语言学习 1 -- 类型

    Go语言接受了函数式编程的一些想法 支持匿名函数与闭包 接受了以Erlang语言为代表的面向消息编程思想 支持goroutine和通道 并推荐使用消息而不是共享内存来进行并发编程 总体来说 Go语言是一个非常现代化的语言 精小但非常强大 学
  • 公司的电脑为什么卡——因为缺少工程师文化

    点击一键订阅 云荐大咖 专栏 获取官方推荐精品内容 学技术不迷路 最近在给一些公司做技术培训时 发现不少公司还面临这些老问题 腰疼的椅子 卡顿的电脑 小尺寸显示器 24 英寸 不能查资料的网络 导致研发效率低下 员工满意度低 离职率高 公司
  • 推荐算法实战项目:用户协同过滤(UserCF)原理以及案例实战(附完整 Python 代码)

    协同过滤 collaborative filtering 是一种在推荐系统中广泛使用的技术 该技术通过分析用户或者事物之间的相似性 来预测用户可能感兴趣的内容并将此内容推荐给用户 这里的相似性可以是人口特征的相似性 也可以是历史浏览内容的相
  • Centos中Docker,docker-compose,jdk8安装

    Centos中Docker docker compose jdk8安装 Date 2018 08 25 使用Docker仓库安装Docker 1 安装所需软件 sudo yum install y yum utils device mapp
  • 5 分钟快速掌握 OKR 管理法 - OKR 实施篇

    上文 5 分钟快速掌握 OKR 管理法 OKR 理论篇 我们讲到 OKR 的价值和意义 这次重点介绍 OKR 如何实施落地 真正为企业发展发挥作用 怎么制定目标 一个合理的目标需要符合三个原则 第一 与战略目标一致 对公司长期发展有价值 第
  • 力扣(LeetCode)2488. 统计中位数为 K 的子数组(C++)

    哈希表 找不到 O n O n O n 思路 试一下等价代换 数组所有数字大小不同 说明数组中最多有一个 k 数组的 k 要包含在 子数组 里 为了便于思考 分析奇数长度的子数组 在子数组里 大于 k 的数 和小于 k 的数 二者数量相等时
  • 深度学习用什么显卡?3060显卡适合深度学习吗?

    都知道深度学习很吃显卡 显存越大 可以缓存的内容就越多 对于非常吃显存的图像类深度学习程序来说 显存太小的显卡批处理就不能调太大 否则会程序会报错 深度学习用什么显卡 3060显卡适合深度学习吗 本文来解答一下这个问题 3060显卡适合深度
  • Spring动态代理用JDK还是用CGLIB?

    切面编程是Spring中非常重要的一个模块 切面编程的实现原理是动态代理 那么动态代理又有两种实现方式 一种方法是直接实现JDK中的InvocationHandler接口 另一种方法是继承CGLIB 那么问题来了 这两种方法有啥区别呢 分别
  • 数据结构——图的DFS(深度优先遍历)- C语言代码实现

    图的深度优先遍历的基本思想 从图中某顶点v出发 1 访问顶点v 2 依次从v的未被访问的邻接点出发 对图进行深度优先遍历 直至图中和v有路径相通的顶点都被访问 3 若此时图中尚有顶点未被访问 则从一个未被访问的顶点出发 重新进行深度优先遍历
  • Javescribt Library Javescript 库 总结

    Yahoo User Interface Library YUI Library YUI is a free open source JavaScript and CSS library for building richly intera
  • JavaScript 刷新或关闭网页时弹窗确认

    beforeunload事件在当页面关闭或刷新时调用 事件触发的时候弹出一个有确定和取消的对话框 确定则离开页面 取消则继续待在本页 有两种方法绑定事件 三种方法实现弹窗 通过 window addEventListener 对 retur
  • 轻量级前端MVVM框架avalon:整体架构

    单看这个图呢 还木有说明 感觉有点蛋疼 作者的将夜 www jiangyea com抽象度太高了 还好在前面已经大概分析过了执行流程 如图 左边是View视图 我们就理解html结构 换句话就是说用户能看到的界面 渲染页面 绑定事件 切换类
  • 【UE4 像素流 WEBUI插件】部署像素流

    目录 一 单实例本地像素流送 步骤 1 勾选插件 2 打包工程并启动信令服务器 3 创建快捷方式并启动游戏 二 单实例局域网像素流送 步骤 1 编辑cirrus js 2 编辑快捷方式属性 3 启动 三 集成WEBUI插件 一 单实例本地像
  • c++深度搜索详解

    1 什么是深度搜索 从计算机科学专业上讲 深度优先搜索算法是最常用图的搜索算法之一 这一算法也是很多重要的图的算法的原型 深度优先搜索其英文全称是Depth First Search 简称DFS 深度搜索的特点是先看 一个方向 例如 骑士在
  • STL deque 源码——deque特点、实现框架、源码分段剖析、常用函数总结(上)

    一 deque的一些特点 支持随机访问 即支持 以及at 但是性能没有vector好 可以在内部进行插入和删除操作 但性能不及list deque 两端 都能够快速插入和删除元素 而vector只能在尾端进行 deque的元素存取和迭代器操