zoukankan      html  css  js  c++  java
  • 重读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的前一个元素.

  • 相关阅读:
    海泉湾
    ns2的wirelessphy中添加定时器
    ns2能量模型添加充电模型
    用gawk和gnuplot来分析ns2的trace文件
    [转载]ns2中的能量模型
    配置本地SVN[转载]
    EMQ插件通过HTTP连接认证服务器实现认证
    在K8S上跑一个helloworld
    EMQ插件组合实现物联网边缘平台的设备通信管理
    在CentOS7上搭建Kubernetes
  • 原文地址:https://www.cnblogs.com/lxy-xf/p/11509701.html
Copyright © 2011-2022 走看看