• STL容器分析--deque


    deque,故名思义,双向队列。可以在头尾进行插入删除。

    而STL中采用了链表+线性表的数据结构来实现deque,因而除了满足双向队列的特点以外,还支持随机访问。

    下面,贴一段代码。

    总览:双向队列是由链式线性表+顺序线性表组成。支持随机访问

    首先看下定义:  

    template >      

    class deque : protected _Deque_base<_Tp, _Alloc>

    可知,需先分析_Deque_base  

    template        

    class _Deque_base {            

    ...            

    _Deque_impl _M_impl;        

    };

    其中,_Deque_impl类型的_M_impl是维持deque有序的关键数据结构,      

    struct _Deque_impl       : public _Tp_alloc_type      

    {     _Tp** _M_map;    

      size_t _M_map_size;    

      iterator _M_start;    

      iterator _M_finish;

        _Deque_impl()     : _Tp_alloc_type(), _M_map(0), _M_map_size(0),       _M_start(), _M_finish()     { }

        _Deque_impl(const _Tp_alloc_type& __a)     : _Tp_alloc_type(__a), _M_map(0), _M_map_size(0),       _M_start(), _M_finish()     { }       };

    可知,在_M_impl中,保存了一个_Tp*的数组_M_map,每个数组的大小为_M_map_size. 并保存了实际数据起始和终止的迭代器。

    假如说_M_map_size = 0x10

    0x70002000:                         0x70002010             

           __________________

    _M_map      |__________________|

    0x70003000:                     0x70003010              __________________             |__________________|  _M_start可以指向任何位置              __________________             |__________________|              __________________             |__________________|              __________________             |__________________| _M_end也可以指向任何位置,只是需要在_M_map中存放于_M_start之后              __________________             |__________________|

    至此,可以通过链表找到顺序线性表,接下来就是定位顺序线性表中元素的位置

  • 相关阅读:
    使用B或BL跳转时,下一条指令的地址的计算
    【flask-Email】邮件发送
    【MAC】 命令行解压缩 rar 文件
    【flask_sqlalchemy】模糊查询
    【python】集合 list差集|并集|交集
    【pycharm】Mac版快捷键
    【mysql】查询最新的10条记录
    【Python】—— 获取当前运行函数名称和类方法名称
    【Python】—— 获取函数内部变量名称
    【python3】 抓取异常信息try/except
  • 原文地址:https://www.cnblogs.com/onlyforcloud/p/3331725.html
Copyright © 2020-2023  润新知