deque其实也是数组,也可以动态的添加和减少元素,但是和vector不同的是,deque可以快速的在头部和尾部添加减少元素(vector只能快速的在尾部添加),然而在插入元素的时候因为头部和尾部都可以添加元素,deque则会选择最近的一端来迭代过去,并插入元素。不过deque更优势的是,内存空间是不连续的。

一、deque的内存空间是分块的

为了验证不连续,我写了一段代码供大家观赏

#include<cstdio>
#include<deque>
#include<vector>
using namespace std; int main()
{
int testnum = 100;
deque<int> md(testnum+1);// +1防止索引越界
int issame = 0;
for(int i=0;i<testnum;i++)
{
// 判断是否是连续数组,不是就打印,是就issame++
if(&md[i+1]-&md[i]!=1)
{
printf("%d %d %d %d\n",&md[i+1]-&md[i],&md[i+1],&md[i], issame);
issame=0;
}
else
issame++;
} return 0;
}

当testnum为100的时候没有输出,说明还是连续的,但是testnum变成1000的时候有了输出,这也就验证了deque是不连续的,当testnum是10000不连续的块就更多了

testnum=100

testnum=1000

testnum=10000

发现规律了没有,每一个连续的块大小都是127然而这样不连续的数据结构可以更好的利用空间,也就是数组和链表的结合版。

下面开始正文了,我来告诉大家deque什么时候用?怎么用?用的时候要注意些什么吧?

二、什么时候用

从上面的小实验得出,deque还是优于vector的,只是空间不连续。忽略空间的连续性和next指针,vector相当于普通链表,而deque就相当于有两个指针分别指向头和尾的链表。所以基本上在没有空间连续的需求,完全deque可以替代vector。

三、怎么用

1.访问元素

方法 解释
d[i] 通过下标访问i位置元素的值
d.at[i] 通过下标访问i位置元素的值
d.front() 访问deque头部元素的值
d.back() 访问deque尾部元素的值
d.begin() 生成头部迭代器(某种意义上的指针)
d.end() 生成尾部迭代器(某种意义上的指针)

2.添加元素

d.push_back(num) 在d的尾部添加num值
d.push_front() 在d的头部添加num值
d.insert(pos,elem) pos是vector的插入元素的位置
d.insert(pos, n, elem) 在位置pos上插入n个元素elem
d.insert(pos, begin, end)  

3.删除元素

d.pop_back() 删除队列尾部元素
d.pop_front() 删除队列头部元素
d.erase(pos) 删除pos位置上的元素
d.erase(begin, end) 删除begin到end区间上的元素,返回下一个元素的位置

4.deque其它操作

d.size()

查看deque的大小

d.empty()

判断deque是否为空

d.clear()

清空deque

四、用的时候要注意什么?

也是和vector一样,需要频繁的在队列中进行元素的增删,这种数据结构还是不适合的

且下标的访问也不要越界

最详细STL(二)deque的更多相关文章

  1. STL中deque 解析

    一.deque的中控器 deque是连续空间(至少逻辑上看来如此),连续线性空间总令我们联想到array或vector.array无法成长,vector虽可成长,却只能向尾端成长,而且其所谓的成长原是 ...

  2. 带你深入理解STL之Deque容器

    在介绍STL的deque的容器之前,我们先来总结一下vector和list的优缺点.vector在内存中是分配一段连续的内存空间进行存储,其迭代器采用原生指针即可,因此其支持随机访问和存储,支持下标操 ...

  3. Gradio入门到进阶全网最详细教程[二]:快速搭建AI算法可视化部署演示(侧重参数详解和案例实践)

    Gradio入门到进阶全网最详细教程[二]:快速搭建AI算法可视化部署演示(侧重参数详解和案例实践) 相关文章:Gradio入门到进阶全网最详细教程[一]:快速搭建AI算法可视化部署演示(侧重项目搭建 ...

  4. stl源码剖析 详细学习笔记deque(3)

    protected: typedef simple_alloc<value_type,Alloc> data_allocator; //用来配置元素的alloc typedef simpl ...

  5. stl源码剖析 详细学习笔记deque(2)

    //---------------------------15/3/13---------------------------- self&operator++() { ++cur; if(c ...

  6. stl源码剖析 详细学习笔记deque(1)

    //--------------------------15/3/12---------------------------- deque { deque没有容量(capacity)观念,是动态分段的 ...

  7. 关于Windows API、CRT和STL二三事

    1.本文编写目的    本文是为了帮助一些人弄清一些关于Windows API, C运行时程序库(CRT), 和标准C++库(STL)的基本概念.有很多人甚至是有经验的程序员在这些概念上是含糊不清的甚 ...

  8. stl之deque双端队列容器

    deque与vector很相似,不仅能够在尾部插入和删除元素,还能够在头部插入和删除. 只是当考虑到容器元素的内存分配策略和操作性能时.deque相对vector较为有优势. 头文件 #include ...

  9. STL之deque双向队列

    deque双向队列是一种双向开口的连续线性空间,可以高效的在头尾两端插入和删除元素,提供随机访问,deque在接口上和vector非常相似,下面列出deque的常用成员函数: Table 6.9. C ...

  10. STL中deque

    以下学习一下STL中另一种序列容器——deque. deque表示double-ended queue,即双向队列,deque是通过作为动态数组的方式实现的,这样可以在两端插入元素.因此,deque可 ...

随机推荐

  1. 3568F-Linux应用开发手册

       

  2. 开源GTKSystem.Windows.Forms,在这里更新预告

    开源GTKSystem.Windows.Forms,在这里更新预告 gitee码云开源地址:https://gitee.com/easywebfactory/gtksystem-windows-for ...

  3. Vue 框架怎么实现对象和数组的监听?

    如果被问到 Vue 怎么实现数据双向绑定,大家肯定都会回答 通过 Object.defineProperty() 对数据进行劫持,但是 Object.defineProperty() 只能对属性进行数 ...

  4. 容器技术Docker知识精讲【形成知识体系篇】

    作者的经验分享,包括很多实战过程和总结,为着手系统化学习Docker容器的朋友提供. 环境要求 Linux操作系统(Centos),建议在虚拟机VMware或VirtualBox下安装Centos D ...

  5. 解决方案 | 1分钟快速解决 win10 任务管理器性能不显示GPU?

    1 问题 环境:win10 22h2 2 解决方法 win+r输入dxdiag回车,查看下面信息: (1)确认你的Windows10版本号大于1909,如果确认,在任务管理器进程页右键名称一栏,将GP ...

  6. 基于微信小程序的校园维修管理系统-开题报告参考

    \n文末获取源码联系 感兴趣的可以先收藏起来,大家在毕设选题,项目以及论文编写等相关问题都可以给我加好友咨询 一.课题研究的目的和意义** 本研究开发基于微信小程序的物品维修系统,它不仅能实现专业的维 ...

  7. Day 5 - 双指针与折半搜索

    双指针 本页面将简要介绍双指针. 引入 双指针是一种简单而又灵活的技巧和思想,单独使用可以轻松解决一些特定问题,和其他算法结合也能发挥多样的用处. 双指针顾名思义,就是同时使用两个指针,在序列.链表结 ...

  8. 阅读翻译Prompting Engineering Guides之Introduction(提示工程简介)

    阅读翻译Prompting Engineering Guides之Introduction(提示工程简介) 关于 首次发表日期:2024-07-19 Prompting Engineering Gui ...

  9. C# 枚举帮助类EnumHelper(获取描述、名称和数值)

    帮助类定义 public class EnumHelper { #region 静态方法 public static Dictionary<string, string> GetEnumD ...

  10. RBAC权限模型概述

    RBAC即role-based access control,基于角色的访问控制 通过角色来管理用户对系统资源的访问权限.RBAC是一种权限管理模型,核心思想是分离用户与具体权限,通过角色作为中介来实 ...