STL源码解析-04序列容器-03deque
*****************************************************
* deque是一种双开口的连续线性空间,可以在两端进行插入和删除操作。
* 特点:
* 允许常数时间内对两端进行插入或删除。
* 没有容量概念,他是动态的以分段连续的空间组合而成。
* 迭代器的复杂度很高,影响效率,尽量用vector,插入删除操作后,迭代器可能直接遗忘。
* 排序操作时,可以现将deque复制到vector,排序后,复制回deque。
* ***************************************************
*********************************************
* deque数据结构
* deque中有一个map指针作为主控,map指向一块连续空间,其中每个元素都是指针,指向另一段连续线性空间,成为缓冲区,缓冲区是deque的存储空间主体,
* 默认是512bytes,在初始时可以设置缓冲区的大小。
* 还有两个迭代器类型的变量,指示start和finish。
* 重点是对迭代器的实现。
* ************************************
*************************************************
* deque的迭代器是随机访问型的,但是实现起来的复杂度很高。
* 在迭代器中需要定义:当前元素的指针,当前元素所在缓冲区的起始指针,当前元素所在缓冲区的尾指针,指向map中指向所在缓区地址的指针。
* 在进行迭代器的移动时,需要考虑跨缓冲区的情况。
* 重载前加(减),在实现后加(减)时,调用重载的前加(减)。
* 重载+=,实现+时,直接调用+=,实现-=时,调用+=负数,实现-时,调用-=.
* //当需要实现新的功能时,最好使用已经重载好的操作,即方便有安全。。。。
*
* 构造函数:根据缓冲区设置大小和元素个数,决定map的大小;给map分配空间,根据缓冲区的个数,分配缓冲区,默认指定一个缓冲区;
* 设置start和finish迭代器,满足左闭右开的原则。
* push_back:如果空间满足,直接插入;不满足,调用push_back_aux。
* push_back_aux:先调用reverse_map_at_back,若符合某种条件,重换一个map;分配空间。
* reserve_map_at_back:看看map有没有满,满的话,调用reallocate_map。
* reallocate_map:如果前端或后端pop过多,就会导致大量的空闲空间,如果是这种情况,则不用新分配空间,调整一下start的位置即可;
* 如果不够,则需要重新申请空间。
* pop:析构元素,如果是最后一块还需要删除空间。
* erase:需要判断,前面的元素少还是后面的元素少,移动较少的部分。
* insert:判断位置,如果为前端或后端直接调用push操作,否则,移动较少的一端。
* **************************************************
浙公网安备 33010602011771号