首先,deque跟vector一样都是支持随机访问的,但是deque跟vector不一样的是deque可以双端进行插入和删除,但是vector不行,表面上看起来这两者数据结构差不错但是实际上相差很大。
首先我们假设deque是存取 T类型的数据。
它包含了一个T** 类型的指针,这个指针里面内容T*指向一段T类型的存取空间,如果大家看了前面的第二级内存分配就应该可以知道原理是一致的。
T** map;
所以当我们的一段指向T类型的空间不够时,我们要做的并不是像vector一样,重新分配一个更大的空间,然后把旧的空间内容复制到新的空间去,再销毁就的空间。在deque里面我们要做的只是重新分配一段空间,把这段空间的指针交给我们的T** map就可以了,我们通过map来统一的映射这段地址。
所以在deque里面我们必须有这些内容:
T** map;
T*(iterator) start,finish;//指向开始的和结尾的元素。
size_t size_map;//我们map 的大小。用于分析,map是否用完,以便重新分配一段新的map
size_t size_buf;//map中每个元素指向的存取T类型数据的空间,这段空间应该大小是固定的,以便统一管理。在STL中,他是通过模板直接提供的,然后调用全局函数 _deque_buf_size得到。
malloc_map(); remalloc_map();//分配map空间
malloc_buffer();dealloc_buffer();//分配map映射的空间和释放空间