重读STL源码剖析:deque

deque

deque是一种双向开头的现行连续空间

但它与vector有差异:

1.deque可以在O(1)的复杂度下进行头端插入与移除,而vector的头端操作效率极差

2.deque没有capacity概念。deque随时可以拼接一段新的连续空间。只有像vector这种可能出现空间不足的容器才需要capacity与reserve的概念。包括list也是不需要capacity与reserve的、

3.vector的迭代器是简单的T*型指针,而deque比这复杂得多,虽然也是Random Access Iterator

数据结构:

最主要的就是两个变量mao和mapsize.

首先介绍下map:map是deque的主控。它是一小块连续地址空间,其中每个元素都是一个指针,指针指向另一段较大的线性连续空间,称作缓冲区。缓冲区才是deque存储空间的主体。

设存储的元素类型为T,则map是一个T**型的指针,它指向一块地址空间,这块空间内存放的是T*型指针,map+1相当于定位到map[1]的位置。T*型指针又指向一块连续区域,这块区域就存放若干T型变量。

mapsize表示map内可存放多少指针

迭代器:

deque的迭代器主要有四个成员:

T* cur;

T* first;

T* last;

map_pointer node;

其中cur first last这三个都是指向缓冲区内的某个元素的指针。cur指向正指着的元素,而first为当前缓冲区的头,而last为当前缓冲区的尾。first与last有点类似vector中的start与end_of_storage

node为一个T**型指针,我们知道,deque中的主要成员变量为中控器map,通过map可以找到不同的缓冲区。而迭代器里的node就为一个T**型变量,它与中控器属于同一种类型,它指向中控器中的某个元素。由于中控器map指向一块区域,该区域内是T**型元素,而node正是指向这个迭代器所属的缓冲区,其在中控器map指向的区域里的变量。即可以通过node来定位到这块缓冲区在中控器里的位置,这样方便跨缓冲区操作

deque更具体的数据结构:

除了mapsize和中控器map外,deque还有两个成员:

1.迭代器start

2.迭代器finish

start指向第一缓冲区的第一个元素(指cur指向),finish指向最后缓冲区的最后一个元素的下一位置.

由于对迭代器的运算符进行了重载,像--finish这种操作,实际上是对finish中cur指向的元素向前退一个,如果cur在缓冲区第一个,则要调到finish前一个迭代器的last的前一个元素.

原文地址:https://www.cnblogs.com/lxy-xf/p/11509701.html

时间: 2024-10-17 07:27:33

重读STL源码剖析:deque的相关文章

STL 源码剖析 deque实现源码

#ifndef _HJSTL_DEQUE_H_ #define _HJSTL_DEQUE_H_ /* * Author:hujian * Time:2016/4/28 * discription:this file is about deque structure. * */ #include "hjstl_alloc.h" #include "hjstl_construct.h" #include "hjstl_iterator.h" #inc

STL源码剖析(deque)

deque是一个双向开口的容器,在头尾两端进行元素的插入跟删除操作都有理想的时间复杂度. deque使用的是分段连续线性空间,它维护一个指针数组(T** map),其中每个指针指向一块连续线性空间. (map左右两边一般留有剩余空间,用于前后插入元素,具体下面可以看到其实现) 根据上图,可以了解到deque的迭代器的基本定义. 1 template <class T, class Ref, class Ptr, size_t BufSiz> 2 struct __deque_iterator

重读STL源码剖析:析构

纯虚析构函数 理论上来说,将一个函数声明为纯虚函数后,这个类即变为抽象类.纯虚函数只提供接口,而不提供实现,但纯虚析构函数一定要提供定义.这是由C++特性决定的,编译器对派生类的析构函数会进行扩展,以静态调用的方式调用其每一个虚基类和上基类的析构函数,尽管是一个抽象类,但仍然要为这个纯虚析构提供实现,即使是awov::~awov() {} 这样没有任何操作的实现,因为如果不提供,将导致链接失败 虚函数与内联 内联函数是一种静态行为,由编译器在调用地点展开,这是在编译期进行的:而虚函数是一种动态行

重读STL源码剖析:map与set

map与set底层都是调用的RBTree 首先看RBTree RBTree 红黑树的特性: 1.根节点为黑色 2.新增节点一定是红色 3.节点只有红色或黑色两种颜色 4.两个节点颜色不能同为红 5.任意一条路径上的黑色节点个数相同 红黑树的节点设计: 1.表示节点颜色的变量color 2.链接左子树的left指针 3.链接右子树的right指针 4.链接父节点的parent指针 5.表示节点值的变量value_field;在map中为pair对,在set中只有key RBTree的迭代器: 1.

STL&quot;源码&quot;剖析-重点知识总结

STL是C++重要的组件之一,大学时看过<STL源码剖析>这本书,这几天复习了一下,总结出以下LZ认为比较重要的知识点,内容有点略多 :) 1.STL概述 STL提供六大组件,彼此可以组合套用: 容器(Containers):各种数据结构,如:vector.list.deque.set.map.用来存放数据.从实现的角度来看,STL容器是一种class template. 算法(algorithms):各种常用算法,如:sort.search.copy.erase.从实现的角度来看,STL算法

通读《STL源码剖析》之后的一点读书笔记

[QQ群: 189191838,对算法和C++感兴趣可以进来] 直接逼入正题. Standard Template Library简称STL.STL可分为容器(containers).迭代器(iterators).空间配置器(allocator).配接器(adaptors).算法(algorithms).仿函数(functors)六个部分. 迭代器和泛型编程的思想在这里几乎用到了极致.模板或者泛型编程其实就是算法实现时不指定具体类型,而由调用的时候指定类型,进行特化.在STL中,迭代器保证了ST

STL源码剖析 --- 空间配置器 std::alloc

STL是建立在泛化之上的.数组泛化为容器,参数化了所包含的对象的类型.函数泛化为算法,参数化了所用的迭代器的类型.指针泛化为迭代器,参数化了所指向的对象的类型.STL中的六大组件:容器.算法.迭代器.配置器.适配器.仿函数. 这六大组件中在容器中分为序列式容器和关联容器两类,正好作为STL源码剖析这本书的内容.迭代器是容器和算法之间的胶合剂,从实现的角度来看,迭代器是一种将operator*.operator->.operator++.operator-等指针相关操作予以重载的class tem

【转载】STL&quot;源码&quot;剖析-重点知识总结

原文:STL"源码"剖析-重点知识总结 STL是C++重要的组件之一,大学时看过<STL源码剖析>这本书,这几天复习了一下,总结出以下LZ认为比较重要的知识点,内容有点略多 :) 1.STL概述 STL提供六大组件,彼此可以组合套用: 容器(Containers):各种数据结构,如:vector.list.deque.set.map.用来存放数据.从实现的角度来看,STL容器是一种class template. 算法(algorithms):各种常用算法,如:sort.se

《STL源码剖析》---stl_deque.h阅读笔记(1)

双端队列deque是容器的一种.它比vector更强大,vector只可以在尾端插入元素,deque不只是可以再尾端插入,也可以在队列头插入.下面借助<STL源代码剖析>的图片讲解. 1.deque的内存结构 vector是开辟一段连续的内存,deque可以在前端插入元素,如果像vector开辟一段连续的内存,向前面插入元素不易维护.例如如果只是开辟一段连续内存,那么前端到开辟内存的起始位置要空多少个位置?当这段内存满了时,拷贝到更大内存时,前端空留多少位置?显然难以维护.deque在STL中