deque 双端队列 是由一段一段的定量连续空间构成
特点:支持快速随机访问,支持索引取值。 在头尾插入和删除速度很快。
底层内部由一个map(非STL的map) 和多个vector缓存段组成,迭代器使用时会在不同的区间跳转。
存取元素的时候,deque内部结构多出一个间接过程,相比vector操作会慢一些,
相比vector,vector在头部操作效率太低。deque 允许于常数时间内对头端进行元素的插入或移除操作。deque没有所谓的容量 capacity 观念,因为它是动态的以分段连续空间组合而成,随时可以增加一段新的空间并连接起来。
底层map(非STL map) 此map 仅代表连续的一段缓存,内存空间大小 默认8,最大 所需节点数 + 2 。
存储数据的数据区不是连续的,从上一个缓存区到下一个缓存区需要调用set_node方法才可以跳转的,所以运算符 ++ -- +n 操作时要慎重。
map中的前2个 和后2个都是预留缓存区,前面的是为了deque 调push_front的时候用。
扩容 reallocate_map() 。当map 前面或者后面存满了(不管是前端还是尾部,只要有一端出现备用空间不足)就会调用rellocate_map 来重新分配内存。
push_front() --- push_front_aux() --- reserve_map_at_front() --- 判断前端节点备用空间不足 --- reallocate_map()
push_back() --- push_back_aux() --- reserve_map_at_back() --- 判断尾部节点备用空间不足 --- reallocate_map()