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操作,否则,移动较少的一端。
 * **************************************************
posted @ 2011-12-02 15:08  magicdog  阅读(198)  评论(0)    收藏  举报