zoukankan      html  css  js  c++  java
  • 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之后              __________________             |__________________|

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

  • 相关阅读:
    【HDOJ6666】Quailty and CCPC(模拟)
    【2019 Multi-University Training Contest 8】
    分布式锁的理解
    反射工具类【ReflectionUtils】
    Maven常用命令
    maven常用命令介绍
    mysql 优化策略(如何利用好索引)
    centos7搭建svn服务器及客户端设置
    Centos7 配置subversion
    Centos7更改网卡名称Eth0
  • 原文地址:https://www.cnblogs.com/onlyforcloud/p/3331725.html
Copyright © 2011-2022 走看看