STL之deque

deque是一种双向开口的数据结构,所谓双端开口,它指可以轻易从两端进行push,pop操作.

1实现方式

1.1deque整体结构

deque从逻辑上来说是连续线性空间,实际来说由一段段的定量连续空间构成,deque负责维护整个整体的连续性。
deque采用一段连续的map空间(不是stl的map)作为主控,map存储着里n个元素,每个元素都是一个指针,指向一片连续的内存空间。如下图:
这里写图片描述

template <class T,class Alloc=alloc,size_t BufSiz = 0>
class deque{
    typedef T** mappointer;          //
    typedef __deque_iterator<T,T&,T*,BufSiz> iterator;
protected:
    iterator start;         //第一个节点
    iterator finish;        //最后一个节点
    map_pointer map;        //指向map,map是个连续空间,每个元素是个指针,指向一片连续数据空间
    size_type map_size;     //map内部指针个数
};

注意,内部也是前闭后开[start,finish)
操作方法
可轻易实现如下操作

  • begin
  • end
  • []
    return start[n];  //迭代器类内实现了[]操作
  • front
  • back
    iterator tmp = finish;
    tmp--;
    return *tmp
  • size
    return finish - start; //迭代器实现了-操作
  • empty

1.2 迭代器

deque要实现逻辑上的连续性,关键在于迭代器的移动。关键点在不同的连续空间见跳转。
这里写图片描述

template <class T,class Ref,class Ptr,size_t BufSiz>
struct __deque_iterator{
    T *cur;       //当前元素位置
    T *first;     //当前缓冲区的第一个元素
    T *last;      //当前缓冲区的最后一个位置(预留一个末尾位置做end,不存元素)
    T ** node;    //指向该连续空间在map的位置
};

同时迭代器实现了* -> ++ – + - += -= [] == != < 等操作(移动迭代器时判断是否还处在当前缓冲区,是否需要切换缓冲区等)


1.3:插入删除

  • push_back
  • push_front
  • pop_front
  • pop_back

从队列首尾进行删除操作,在定义deque时,默认会构造一个map(除非指定了元素个数)。
构造出的map中控,由两个指针nStart,nEnd。默认指向map连续空间的中间,这样可以方便前插后插。

具体细节不加讨论,大概思路就是

插入时,判断当前缓冲区有没有位置,有则插入,没有构造新一整块缓冲区,push_back 新元素放入新缓冲区的开始,push_front新元素放入新缓冲区的末尾。

删除时,删除节点,同时判断是否需要清空这块缓冲区.

同时这两种操作都需要对中控map进行增加或减少节点,并判断中控map大小是否足够,不够重新换一块map。

  • earse
    iterator erase(iterator it);//删除双端队列中的某一个元素

    iterator erase(iterator first,iterator last);//删除双端队列中[first,last)中的元素
  • insert
    //双端队列中某一元素前增加一个元素x
    iterator insert(iterator it,const T& x);

    //双端队列中某一元素前增加n个相同的元素x
    void insert(iterator it,int n,const T& x);

    //双端队列中某一元素前插入另一个相同类型向量的[forst,last)间的数据
    void insert(iterator it,const_iterator first,const_iteratorlast);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值