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的前一个元素.

  • 相关阅读:
    【转】汽车CAN总线
    【转】I2C总线协议
    【转】SPI总线协议
    【转】结构struct 联合Union和枚举Enum的细节讨论
    复合类型变量其首地址的几种表示方式
    【转】四款经典3.7v锂电池充电电路图详解
    【转】crc16几种标准校验算法及c语言代码
    【转】 CRC循环冗余校验码
    对STM32库函数中 assert 函数的认知
    【转】用宏定义代替printf函数
  • 原文地址:https://www.cnblogs.com/lxy-xf/p/11509701.html
Copyright © 2011-2022 走看看