最详细STL(二)deque
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的更多相关文章
- STL中deque 解析
一.deque的中控器 deque是连续空间(至少逻辑上看来如此),连续线性空间总令我们联想到array或vector.array无法成长,vector虽可成长,却只能向尾端成长,而且其所谓的成长原是 ...
- 带你深入理解STL之Deque容器
在介绍STL的deque的容器之前,我们先来总结一下vector和list的优缺点.vector在内存中是分配一段连续的内存空间进行存储,其迭代器采用原生指针即可,因此其支持随机访问和存储,支持下标操 ...
- Gradio入门到进阶全网最详细教程[二]:快速搭建AI算法可视化部署演示(侧重参数详解和案例实践)
Gradio入门到进阶全网最详细教程[二]:快速搭建AI算法可视化部署演示(侧重参数详解和案例实践) 相关文章:Gradio入门到进阶全网最详细教程[一]:快速搭建AI算法可视化部署演示(侧重项目搭建 ...
- stl源码剖析 详细学习笔记deque(3)
protected: typedef simple_alloc<value_type,Alloc> data_allocator; //用来配置元素的alloc typedef simpl ...
- stl源码剖析 详细学习笔记deque(2)
//---------------------------15/3/13---------------------------- self&operator++() { ++cur; if(c ...
- stl源码剖析 详细学习笔记deque(1)
//--------------------------15/3/12---------------------------- deque { deque没有容量(capacity)观念,是动态分段的 ...
- 关于Windows API、CRT和STL二三事
1.本文编写目的 本文是为了帮助一些人弄清一些关于Windows API, C运行时程序库(CRT), 和标准C++库(STL)的基本概念.有很多人甚至是有经验的程序员在这些概念上是含糊不清的甚 ...
- stl之deque双端队列容器
deque与vector很相似,不仅能够在尾部插入和删除元素,还能够在头部插入和删除. 只是当考虑到容器元素的内存分配策略和操作性能时.deque相对vector较为有优势. 头文件 #include ...
- STL之deque双向队列
deque双向队列是一种双向开口的连续线性空间,可以高效的在头尾两端插入和删除元素,提供随机访问,deque在接口上和vector非常相似,下面列出deque的常用成员函数: Table 6.9. C ...
- STL中deque
以下学习一下STL中另一种序列容器——deque. deque表示double-ended queue,即双向队列,deque是通过作为动态数组的方式实现的,这样可以在两端插入元素.因此,deque可 ...
随机推荐
- C++ 史上首次超越 C,Python 第二!
TIOBE 公布了 2024 年 6 月的编程语言排行榜--C++ 史上首次超越 C,跃至榜二,仅次于 Python. C++ 是一种广泛应用于嵌入式系统.游戏开发和金融交易软件等领域的语言,在本月成 ...
- PHP转Go系列 | GET 和 POST 请求的使用姿势
大家好,我是码农先森. 说到 HTTP 请求工具想必对我们做 Web 开发的程序员都不陌生,只要涉及到网络请求都必须使用.对于我们 PHP 程序员来说,最熟悉不过的就是 CURL 扩展,只要安装的这个 ...
- 实测52.4MB/s!全国产ARM+FPGA的CSI通信案例分享!
CSI总线介绍与优势 CSI(CMOS sensor parallel interfaces)总线是一种用于连接图像传感器和处理器的并行通信接口,应用于工业自动化.能源电力.智慧医疗等领域,CSI总线 ...
- 【资料分享】RK3568开发板规格书(4x ARM Cortex-A55(64bit),主频1.8GHz)
1 开发板简介 创龙科技TL3568-EVM是一款基于瑞芯微RK3568J/RK3568B2处理器设计的四核ARM Cortex-A55国产工业评估板,每核主频高达1.8GHz/2.0GHz,由核心板 ...
- 嵌入式HLS 案例开发步骤分享——基于Zynq-7010/20工业开发板(1)
目 录 前 言 3 1 HLS 开发流程说明 5 1.1 HLS 工程导入 5 1.2 编译与仿真 6 1.3 综合 8 1.4 IP 核封装 10 1.5 IP 核测试 14 前 言 本文主要介绍 ...
- Linux服务器从头配置
安装配置jdk 下载 jdk jdk-8u171-linux-x64.tar.gz 将该压缩包放到/usr/local/jdk目录下然后解压(jdk目录需要自己手动创建) tar zxvf jdk-8 ...
- Mac VMware Fusion 11.5 虚拟机带密钥
虚拟机 链接: https://pan.baidu.com/s/19V20p5ZV-1U5lFNHrotLgw 密码: rdun CentOS 6.5 链接: https://pan.baidu.co ...
- TypeScript 学习笔记 — 交叉类型、条件类型和条件分发(八)
目录 交叉类型 条件类型 1. 直接传入判断的条件 2. 把条件当成泛型传入 3. 多重条件判断 4. 判断接口中的类型 extends 父子关系(类型等级) 条件分发机制 实际开发中如何避免? &l ...
- Profinet转ModbusTCP网关模块连发那科机器人与DCS通讯
一.现场要求:发那科机器人作为服务器端,DCS作为客户端向发那科机器人发送读写请求,发那科机器人应答后DCS接收发那科机器人的数据,实现数据的传递. 二.解决方案:在不增加编程任务的前提下只需在DCS ...
- [oeasy]python0070_动态类型_静态类型_编译_运行_匈牙利命名法
动态类型_静态类型 回忆上次内容 上次了解了 帮助文档的 生成 开头的三引号注释 可以生成 帮助文档 文档 可以写成网页 python3 本身 也有 在线的帮助手册 目前的程序 提高了 可 ...