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. python爬虫-bs4基础

    # 下面的一段HTML代码将作为例子被多次用到.这是 爱丽丝梦游仙境的 的一段内容(以后内容中简称为 爱丽丝 的文档): html_doc = """ <html& ...

  2. 韦东山freeRTOS系列教程之【第六章】信号量(semaphore)

    目录 系列教程总目录 概述 6.1 信号量的特性 6.1.1 信号量的常规操作 6.1.2 信号量跟队列的对比 6.1.3 两种信号量的对比 6.2 信号量函数 6.2.1 创建 6.2.2 删除 6 ...

  3. Notepad++ 搭建简单Java编译运行环境

    简介 有时候使用Eclips进行Java相关方法的测试和验证太繁琐,经过查询实践,使用了Notepad++和JDK搭建了一个简单的编译运行环境. 搭建过程 在电脑上安装Java环境(网上教程很多,此过 ...

  4. NewstarCTF 2023 Misc

    NewStarCTF 2023 Misc week1 的 misc 请移步上一篇 NewStarCTF WEEK2 新建Word文档 直接复制出不来,改后缀为zip,document.xml得到内容 ...

  5. linux实现SSH免密登录设置,以及shell脚本实现

    分享/朱季谦 最近在搭建linux集群,做了SSH免密登录的设置,正好把过程记录一下: 一.用搭建好的两台虚拟机做演示,A机器:192.168.200.129,B机器:192.168.200.128 ...

  6. 简单万能队列状态机——WTYKAMC@2023

    WTYKAMC@2023框架 [简介] 这是一个基于队列的灵活状态机,可以满足队列元素先进先出,先进后出,后进后出,后进先出,可以清除队列中未执行完的状态,且有一个默认超时执行状态:通过超时时间可以改 ...

  7. 网络基础 登录对接CAS-跨域导致的一个意想不到的Bug

    登录对接CAS-跨域导致的一个意想不到的Bug 背景描述 业务需求是平台登录,接入Cas验证 问题描述 平台登录页,点击登录方式,跳转Cas登录页,提交登录请求,结果发现,又返回平台登录页: 再次点击 ...

  8. Django 继承AbstractUser扩展用户模型

    Django 继承AbstractUser扩展用户模型 by:授客 QQ:1033553122 测试环境 Win 10   Python 3.5.4   Django-2.0.13.tar.gz 官方 ...

  9. 矩阵的奇异值分解(SVD)及其应用

    奇异值分解(Singular Value Decomposition, SVD)是矩阵的一种分解方法,与特征值分解不同,它可以应用于长方矩阵中,并将其分解成三个特殊矩阵的乘积.此外SVD分解还具有许多 ...

  10. 腾讯云免费申请SSL证书配置https

    证书申请 1.进入腾讯云官网,在上方直接搜索SSL,搜索到后点击立即选购: 2.点击进去后选择自定义配置,加密标准选择默认的国际标准,证书种类选择域名免费版(DV),勾选同意服务条款后选择免费快速申请 ...