欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

STL之deque

程序员文章站 2022-03-31 10:21:27
...

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

1实现方式

1.1deque整体结构

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

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要实现逻辑上的连续性,关键在于迭代器的移动。关键点在不同的连续空间见跳转。
STL之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);
相关标签: deque stl