最详细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可 ...
随机推荐
- arm 移植 lighttpd + CGI 配置
--- title: arm 移植 lighttpd + CGI 配置 EntryName: porting-lighttpd-on-arm-and-make-cgi-config date: 202 ...
- yb课堂 视频详情页模块开发《三十八》
CourseDetail基础模块开发 CourseDetail模块开发,拆分组件 CourseDetail.vue Header.vue Course.vue Tab.vue Summary.vue ...
- FPGA bit转bin文件
首先科普一下 什么是bitstream文件 FPGA比特流(bitstream)是一种用于配置可编程逻辑器件的数据格式,特别是现场可编程门阵列(FPGA).比特流包含了硬件逻辑电路.路由信息以及芯片上 ...
- 全网最适合入门的面向对象编程教程:08 类和对象的Python实现-@property装饰器:把方法包装成属性
全网最适合入门的面向对象编程教程:08 类和对象的 Python 实现-@property 装饰器:把方法包装成属性 摘要: 本文主要对@property 装饰器的基本定义.使用场景和使用方法进行了介 ...
- leetcode简单(双指针):[88, 202, 345, 392, 455, 905, 922, 917, 925, 942]
[toc 88. 合并两个有序数组 var merge = function(nums1, m, nums2, n) { let A1 = nums1.slice(0, m) let A2 = num ...
- 基于django(爱抚宠物) 小程序设计和实现(源码+LW+部署讲解)
感兴趣的可以先收藏起来,大家在毕设选题,项目以及论文编写等相关问题都可以给我加好友咨询 系统介绍: 科技进步的飞速发展引起人们日常生活的巨大变化,电子信息技术的飞速发展使得电子信息技术的各个领域的应用 ...
- [oeasy]python0092_homebrew_家酿俱乐部_比尔盖茨_保罗艾伦
编码进化 个人电脑 intel 8080 的出现 让 人人都 可能有 一台计算机 Ed Robert 的 创业之路 从 售卖 diy 组装配件 到进军 计算器市场 计算器 毕竟不是 个人计算机 这计算 ...
- Java 中的一些知识点
Java 中的一些知识点 Java 中的知识点 与C++相关 toString方法 super 与C++相关[了解的不是很多] 在Java程序中:一个方法以 ; 结尾,并且修饰符列表中有 native ...
- 商业级java开发单体项目环境搭建
写在开发前,端口经常被战占,windows10用以下命令先查先杀,netstat -aon | findstr "8080" taskkill /F /PID <PID> ...
- LeetCode654. 最大二叉树
题目链接:https://leetcode.cn/problems/maximum-binary-tree/description/ 题目叙述 给定一个不重复的整数数组 nums . 最大二叉树 可以 ...