[STL]deque和stack、queue
怎么说呢,deque是一种双向开口的连续线性空间,至少逻辑上看上去是这样。然而事实上却没有那么简单,准确来说deque其实是一种分段连续空间,因此其实现以及各种操作比vector复杂的多。
一.deque的中控器
deque是有一段一段的定量连续空间构成,采用一块所谓的map(当然不是map容器)作为主控。map是一小块连续空间,其中每一个元素都是一个指针,指向另一段连续性空间(缓冲区)。缓冲区才是deque的储存空间主体。我们可以指定缓冲区大小,默认值0表示使用512字节缓冲区。deque设计结构如下图所示:
二.deque的数据结构
deque除了维护map的指针外,也要维护start,finish两个迭代器,分别指向第一缓冲区的第一个元素和最后缓冲区的最后一个元素(的下一个位置)。此外,它还要记录当前map的大小,因为当map结点不够的时候,需要另外配置一个更大的map,计算其大小需要知道当前map的大小(源码为:new_map_size=map_size+max(map_size,nodes_to_add)+2;)。deque数据结构如下:
class deque
{
public:
typedef T value_type;
typedef valude_type *pointer;
typedef size_f size_type;
public: //迭代器
typedef __deque_iterator<T,T&,T*,BufSiz> iterator;
protected: //元素的指针的指针
typedef pointer *map_pointer;
protected:
iterator start;
iterator finish;
map_pointer map;
size_type map_size; //map中指针个数
...
};
三.deque的成员函数
考虑到deque的特殊结构,所以实现deque的各种操作都相当琐碎复杂。最关键的就是判断是否已经处于缓冲区边缘,如果是,一旦前进或后退就必须跳跃至下一个或上一个缓冲区。还有一个重要问题就是当map前端或尾端备用空间不足时就要重新配置新map(配置更大的,拷贝原来的,释放原来的),下面的push_back()和push_front()等函数都需要先判断。下面分别解释deque的各个成员函数。
- push_back():当最后缓冲区有两个(含)以上的空间,直接在缓冲区增加新元素;当最后缓冲区只剩一个备用空间时,push_back()调用push_back_aux(),先配置一个新的缓冲区,然后再在那个仅剩的备用空间定义新元素,并更改finish的状态,令其指向新结点。
- push_front():当第一缓冲区有备用空间时,直接在备用空间增加新元素;当第一缓冲区无备用空间时,调用push_front_aux()配置新结点(缓冲区),增加新元素,并改变start状态。
- pop_back():当最后缓冲区有一个(含)以上元素,就将finish向前移一位并将最后那个元素析构掉;当最后缓冲区没有任何元素,就调用push_pop_aux()将这个缓冲区释放。解释一下:第一种情况finish指向最后缓冲区的first位置,第二种情况finish指向最后第二个缓冲区的last位置。
- pop_front():第一缓冲区有两个(含)以上元素,将第一个元素析构,将start后移;否则,将这个缓冲区释放,start指向下一个缓冲区第一个元素。
- clear():deque的最初状态(即无任何元素时)保有一个缓冲区,因此clear()之后也一样要保留一个缓冲区,finish=start。
- erase():先判断清除空间前后元素个数,移动较少一端。
- insert():若在最前端,即push_front(),最后端类似;判断插入点前后元素个数,移动较少的一端。
四.配接器stack和queue
stack是一种先进后出(FILO)的数据结构,它只有一个出口。deque是双向开口的数据结构,所以SGI STL便以deque作为缺省情况下的stack底部结构,封闭其头端开口。stack没有迭代器,所以除了顶部元素,无法存取其它元素,即不能遍历stack。
stack的成员函数都是针对其顶部元素进行操作:push(),pop(),top()。
queue是一种先进先出(FIFO)的数据结构,它有两个出口。queue也是以deque作为底部结构,封闭其底端的出口和前端的入口。queue,只有顶端(两端)的元素能被外部使用,所以queue也没有迭代器,不提供遍历功能。
queue的成员函数有:front(),back(),push(),pop()。
可以看到stack和queue的成员函数以及特性都是针对其数据结构来的,所以深入理解其内部结构,不易与deque众多的成员函数混淆。当然stack和queue也可以list为底层结构实现。
参考:《STL源码剖析》
[STL]deque和stack、queue的更多相关文章
- STL容器适配器 stack, queue
stack是一种后进先出(last in first out)的数据结构.它只有一个出口,如图所示.stack允许新增元素,删除元素,取得最顶端元素.但除了最顶端外,没有其他任何地方可以存储stack ...
- STL容器(Stack, Queue, List, Vector, Deque, Priority_Queue, Map, Pair, Set, Multiset, Multimap)
一.Stack(栈) 这个没啥好说的,就是后进先出的一个容器. 基本操作有: stack<int>q; q.push(); //入栈 q.pop(); //出栈 q.top(); //返回 ...
- STL容器用法速查表:list,vector,stack,queue,deque,priority_queue,set,map
list vector deque stack queue priority_queue set [unordered_set] map [unordered_map] multimap [uno ...
- java三篇博客转载 详解-vector,stack,queue,deque
博客一:转载自http://shmilyaw-hotmail-com.iteye.com/blog/1825171 java stack的详细实现分析 简介 我们最常用的数据结构之一大概就是stack ...
- stl源码剖析 详细学习笔记stack queue
// // stack.cpp // 笔记 // // Created by fam on 15/3/15. // // //---------------------------15/03/1 ...
- deque Comparison of Queue and Deque methods Comparison of Stack and Deque methods
1. 队列queue和双端队列deque的转换 Queue Method Equivalent Deque Methodadd(e) addLast(e)offer(e) offerLast(e)re ...
- STL之容器适配器queue的实现框架
说明:本文仅供学习交流,转载请标明出处,欢迎转载! 上篇文章STL之容器适配器stack的实现框架已经介绍了STL是怎样借助基础容器实现一种经常使用的数据结构stack (栈),本文介绍下第二种STL ...
- STL~Deque简介
转自百度经验deque简介 deque是双向开口的连续性存储空间.虽说是连续性存储空间,但这种连续性只是表面上的,实际上它的内存是动态分配的,它在堆上分配了一块一块的动态储存区,每一块动态存储去本身是 ...
- STL Deque 容器
STL Deque 容器 Deque简介 deque是“double-ended queue”的缩写,和vector一样都是STL的容器,deque是双 端的,而vector是单端的. ...
随机推荐
- 苹果内付费 IAP
创建app内购买项目 消耗型项目:对于消耗型App内购买项目,用户每次下载时都必须进行购买.一次性服务通常属于消耗型项目,例如钓鱼App 中的鱼饵. 非消耗型项目:对于非消耗型App内购买项目,用户仅 ...
- SQLserver查询数据库所有字段-表名
SELECT * FROM INFORMATION_SCHEMA.columns WHERE TABLE_NAME='Account' SELECT (case when a.colorder=1 t ...
- Android 设计模式
简介 项目开发中发现问题.解决问题这个过程中会出现很多问题,比如重复出现.某个问题的遗留,这些问题的本质就是设计模式.今天记录设计模式的知识点. 内容 在java以及其他的面向对象设计模式中,类与类之 ...
- iOS项目开发中的目录结构
目录结构: 1.AppDelegate 这个目录下放的是AppDelegate.h(.m)文件,是整个应用的入口文件,所以单独拿出来. 2.Models 这个目录下放一些与数据相关的Mod ...
- IIS、SQL SERVER和VS的安装顺序
正确安装顺序:先安装IIS,再安装SQL SERVER,最后安装VS. 如果先安装VS后安装的IIS,则需要找到对应的.net framework目录下,执行aspnet_regiis.exe,重新注 ...
- Java实现Internet地址获取
Java实现Internet地址获取 代码内容 输入域名输出IPV4地址 输入IP地址输出域名 支持命令行输入 支持交互式输入 代码实现 /* nslookup.java */ import java ...
- homework-04 抓瞎
程序截图 这是基本版本截图....空都没填上 四个角的话 可以留下四个单词 最后添上就行 程序思路 在一个大平面上先一个中心,然后从中心向四周填词 每次填词时,寻找一个使得矩阵最小的 代目如下 #in ...
- XAML中ContentControl,ItemsControl,DataTemplate之间的联系和区别
接触XAML很久了,但一直没有深入学习.今天学习了如标题所示的内容,所以来和大家分享一下,或者准确的说是自我回顾一遍. 在XAML中,有两类我们常见的控件,分别是ContentControl和Item ...
- ubuntu 13.04 163源(亲测可用)
# deb cdrom:[Ubuntu )]/ trusty main restricted # See http://help.ubuntu.com/community/UpgradeNotes f ...
- [转载]poi导出excel,可以自定义保存路径
poi导出excel比js导出excel安全性更好,在使用poi导出excel时,先要导入poi-3.5-FINAL-20090928.jar包到你项目的lib目录下,我这里选择是3.5版的 1.ac ...