STL之deque
程序员文章站
2022-03-31 10:21:27
...
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);