《STL源码分析》deque的实现

本博客用于整理本人学习原博客时一些问题。《STL 源码剖析》 deque 实现原理 - Linese - 博客园 (cnblogs.com)

一、deque概述

        deque是动态开辟的二维数组,第一位存放的是数组指针,第二位要存放的元素。

二、deque的数据结构

        deque 采用一块所谓的map(非stl map)作为主控,map是一小块连续空间。每个元素(节点)都是指针,其指向一段较大的连续性空间,被称为缓冲区。缓冲区才是 deque的存储主体。

        其中每一个缓冲区的大小是固定的(4096),例如std::deque<int>,每一个缓冲区一共有4096/sizeof(int)个元素。

deque的数据结构如下:

  1. map: 指向map
  2. map_size: map内有多少指针
  3. start:第一个节点的第一个元素
  4. finish:最后一个节点的最后一个元素

三、deque 迭代器和数据结构

        deque 为了维持整体连续的假象,因此总体的任务就落在迭代器的 opterator ++ 和 opteartor – 身上。

其迭代器主要由四个元素构成:

  1. cur:当前指向的元素地址
  2. firest:元素所属缓冲区的头
  3. last:元素所属缓冲区的尾
  4. node:指向缓冲区所属的map的位置

        在缓冲区内,迭代器遍历方式和普通迭代器相同,当进行到缓冲区边缘时,需要调用 set_node() 跳到下一个缓冲区。

void set_node(map_pointer new_node)
{
   node = new_node;
   first = *new_node;
   last = first + difference_typ(buffer_size());
}

四、deque的基本操作

        deque 实现其随机存储的方式,总体思路上,根据总长度和每段缓冲区固定长度,来决定,要查找map中第几个node,再确定是缓冲区中,第几块内存。例如

  1. 假设一个缓冲区可以放入8个元素;
  2. 当deque查找[20] 元素时,20/8 + 1 = 3 (第三个node,为何+1? 是因为 map结构中 要预留头尾两个节点,用于扩充,实际元素在map 第二个node开始存储);
  3. 缓冲区第几个: 20%8 = 4(缓冲区第四个元素)

另外deque在放元素的时候是往中间放,因为要把两边留出来才能做到双端。

五、deque和vector的区别

区别一:底层数据结构

区别二:前中后插入删除时间复杂度,前deque O(1) vector O(n)

区别三:对于内存的使用效率,vector需要连续的内存空间,所有deque可以分块内存存储,不需要内存空间一块连续的使用效率更高。

区别四:在中间insert或者erase,vector和deque他们的效率谁要好一点,是vector,因为内存是完全连续的,更好摞动

  • 29
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值