最详细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可 ...
随机推荐
- 解决keil5仿真错误:Encountered an improper argument
--- title: 解决keil5仿真错误:Encountered an improper argument date: 2020-06-18 03:13:18 categories: tags: ...
- 2 手机号登录时,调的不是login接口,而是注册的一个接口
手机号登录时,调的不是login接口,而是注册的一个接口
- Django使用 DoesNotExist 异常和 Logger 来记录异常情况
代码不仅处理了特定的异常类型,还可以添加更多的调试信息来帮助诊断问题.可以使用 DoesNotExist 异常和 Logger 来记录异常情况. from django.core.exceptions ...
- [oeasy]python0078_变量部分总结_variable_summary
删除变量 回忆上次内容 上次研究了变量的死 有生就有死 原本的死是在程序退出的时候自动执行的 也可以手动给变量执行死刑 del del(a)之后 dir()就无法在当前作用域(scope)内观 ...
- [oeasy]python0053_ 续行符_line_continuation_python行尾续行
续行符与三引号 回忆上次内容 上次还是转义序列 类型 英文 符号 \a bell 响铃 \b backspace 退格 \t tab 水平制表符 \v vertical tab 垂直制表符换行不回车 ...
- JAVA私有构造函数---java笔记
在Java中,构造函数是一种特殊的方法,它用于初始化新创建的对象.当我们创建一个类的实例时,构造函数会自动被调用. 构造函数可以有不同的访问修饰符,如public.protected.default( ...
- css3实现背景三角形样式
话不多说上效果图: css: font-family: PingFang-SC-Heavy, PingFang-SC; font-weight: 800; color: #2160AD; border ...
- leetcode2397. 被列覆盖的最多行数 回溯法/枝剪
第一次手搓一个回溯法,超时后采用枝剪勉强通过 class Solution { int max=0; int numSelect; public int maximumRows(int[][] mat ...
- 题解 CF741E Arpa’s abnormal DNA and Mehrdad’s deep interest
CF741E Arpa's abnormal DNA and Mehrdad's deep interest 记 \(R_{i}\) 表示把 \(T\) 插入在 \(S\) 的第 \(i\) 位后组成 ...
- Jmeter汉化成中文版
1.jmeter安装成功后,默认启动是英文版 2.汉化方法 到jmeter安装目录下找到\bin\jmeter.properties,右键记事本打开定位"#language=en" ...