当前位置: 首页 > news >正文

C++ deque 双端队列

deque原理介绍

deque(双端队列):是一种双开口的"连续"空间的数据结构,双开口的含义是:可以在头尾两端进行插入和删除操作,且时间复杂度为O(1)。

与vector比较,头插效率高,不需要搬移元素;与list比较,空间利用率比较高。

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

双端队列底层是一段假象的连续空间,实际是分段连续的。

为了表面看起来上连续的,我们就需要迭代器来封装底层。

deque迭代器

成员函数中有两个迭代器start finish,中控数组map存储空间的起始地址

而迭代器中有3个一级指针,和1个二级指针node(用来找中控数组map中下一段内存空间的地址)

1.start finish迭代器中的first last都是指向这段连续小区间的起始和末尾。

2.start的cur是指向第一个元素,而finish的cur是指向最后一个元素后面的位置。

可以看到deque可以支持vector的[]下标的随机访问,链表的头删 头插。

1.push_back尾插。

如果最后一段区间没满,直接插入就行。反之,就需要重新开辟一块空间,并在map中记录起始地址,再插入。

2.push_front头插

头插的话也要开辟一块空间,但数据的存入顺序是在这一段空间的末尾倒着存入。

3.[]随机访问

虽然deque的底层空间并不是完全连续的,但每次开辟的空间buff大小是确定的。

对要访问的下标先除buff空间大小找到在第几个buff上,再取余找到在buff上的第几个元素。

 

我们知道头插数据是倒着存入的,如果第一段空间没有满又改怎么办呢?

我们可以假设第一段空间满了,让要访问的下标加上第一段空间空的元素个数(cur-first)。

4.迭代器遍历

当cur==last时说明当前buff数组已经遍历结束,set_node(node+1)根据map数组找到下一段空间的起始位置。first=*new_node new_node是二级指针解引用就是空间的起始地址。

vector list deque优劣势

vector

优势:1.尾删/插效率高

2.支持随机访问

3.顺序表CPU高速缓存命中率更高(物理地址是连续的)

劣势:
1.头或中间删/插效率低

2.空间利用效率不高

3.扩容费时间,还可能存在空间的浪费。

list

优势:1.插入删除效率高

2.按需申请空间避免空间的浪费。

劣势:1.不支持随机访问。

2.CPU高速缓存命中率低(物理地址是不连续的)

deque

优势:1.对比vector头插效率更高

2.对比list可以随机访问

劣势:1.虽然可以随机访问但效率是不如vector,毕竟空间不是完全连续的。

(可以少量访问,像排序,遍历还是用vector好)

2.在中间插入删除,还是需要移动数据的。

http://www.lryc.cn/news/361140.html

相关文章:

  • Java | Leetcode Java题解之第127题单词接龙
  • 容器编排技术:现状、应用与未来
  • SQL158 每类视频近一个月的转发量/率
  • 自动化办公01 smtplib 邮件⾃动发送
  • Flutter 中的 ScrollConfiguration 小部件:全面指南
  • 网络网络层
  • 【Docker】学习笔记(超万字图文整理)
  • el-table超过宽度强制显示滚动条
  • Vue3集成Phaser-飞机大战游戏(设计与源码)
  • C51学习归纳1 --- led点亮、led闪烁、led流水灯
  • 使用STM32和TB6600驱动器控制42BYGH步进电机
  • 【Qt】对话框
  • Python | 武理刷题
  • 如何设置让背景颜色不包括 padding 部分,顺带全面学习 background-clip 属性(可以实现文字渐变)
  • Oracle 序列-SEQUENCE
  • 8岁儿童学编程基础好吗:探索早期编程教育的利与弊
  • vue3加axios配合element-plus实现图片等文件本地上传,并获取服务器返回的真实地址数据,前端写法
  • 面试题:谈谈你对观察者和订阅发布的理解
  • 下载文件流
  • 有开源软件,也有开源硬件?
  • 【TensorFlow深度学习】卷积层变种与深度残差网络原理
  • 每日一题《leetcode-- LCR 025.两数相加||》
  • MySQL数据库的约束
  • 计算机毕业设计 | springboot+vue会议室管理系统(附源码)
  • 常见端口及其脆弱点
  • JS函数的进阶
  • 【UE+GIS】UE5GIS CAD或shp构建3D地形
  • Unity学习笔记---音视频播放
  • 项目集成过程中的makefile记录
  • Vue3 -Computed计算属性