C++ STL 容器 deque 内部实现原理
2013-04-06 16:09
603 查看
双端队列(deque)是一种支持向两端高效地插入数据、支持随机访问的容器。
其内部实现原理如下:
双端队列的数据被表示为一个分段数组,容器中的元素分段存放在一个个大小固定的数组中,此外容器还需要维护一个存放这些数组首地址的索引数组,如下图所示。
由于分段数组的大小是固定的,并且它们的首地址被连续存放在索引数组中,因此可以对其进行随机访问,但效率比vector低很多。
向两端加入新元素时,如果这一端的分段数组未满,则可以直接加入,如果这一端的分段数组已满,只需创建新的分段数组,并把该分段数组的地址加入到索引数组中即可。无论哪种情况都不需要对已有元素进行移动,因此在双端队列的两端加入新的元素都具有较高的效率。
当删除双端队列容器两端的元素时,由于不需要发生元素的移动,效率也是非常高的。
双端队列中间插入元素时,需要将插入点到某一端之间的所有元素向容器的这一端移动,因此向中间插入元素的效率较低,而且往往插入位置越靠近中间,效率越低。删除队列中元素时,情况也类似,由于被删除元素到某一端之间的所有元素都要向中间移动,删除的位置越靠近中间,效率越低。
注意:
在除了首尾两端的其他地方插入和删除元素,都将会导致指向deque元素的任何pointers、references、iterators失效。不过,deque的内存重分配优于vector。因为其内部结构显示不需要复制所有元素。
其内部实现原理如下:
双端队列的数据被表示为一个分段数组,容器中的元素分段存放在一个个大小固定的数组中,此外容器还需要维护一个存放这些数组首地址的索引数组,如下图所示。
由于分段数组的大小是固定的,并且它们的首地址被连续存放在索引数组中,因此可以对其进行随机访问,但效率比vector低很多。
向两端加入新元素时,如果这一端的分段数组未满,则可以直接加入,如果这一端的分段数组已满,只需创建新的分段数组,并把该分段数组的地址加入到索引数组中即可。无论哪种情况都不需要对已有元素进行移动,因此在双端队列的两端加入新的元素都具有较高的效率。
当删除双端队列容器两端的元素时,由于不需要发生元素的移动,效率也是非常高的。
双端队列中间插入元素时,需要将插入点到某一端之间的所有元素向容器的这一端移动,因此向中间插入元素的效率较低,而且往往插入位置越靠近中间,效率越低。删除队列中元素时,情况也类似,由于被删除元素到某一端之间的所有元素都要向中间移动,删除的位置越靠近中间,效率越低。
注意:
在除了首尾两端的其他地方插入和删除元素,都将会导致指向deque元素的任何pointers、references、iterators失效。不过,deque的内存重分配优于vector。因为其内部结构显示不需要复制所有元素。
相关文章推荐
- C++ STL容器deque内部实现原理
- C++ STL容器deque内部实现原理
- C++ STL 容器 deque 内部实现原理
- C++ STL: deque的实现原理
- [C++] STL容器设计原理
- STL之deque容器的实现框架
- stl容器的实现原理-与数据结构的对应关系
- [4.3]STL容器List之内部Sort算法原理
- stl容器的区别:vector list deque set map-底层实现
- stl容器区别: vector list deque set map及底层实现
- C++标准模板库(STL)迭代器的原理与实现
- [翻译] C++ STL容器参考手册(第二章 <deque>)
- C++封装继承多态 及内部实现原理详解
- C++之STL(二):实现简单容器模板类Vec(vector capacity 增长问题、allocator 内存分配器)
- C++STL容器的基本特性和原理
- 用C++实现STL容器vector
- 【转】STL 容器类内部实现
- 实现自己的C++ STL--vector容器
- STL容器的实现原理
- stl容器区别: vector list deque set map-底层实现