C++ STL: deque的实现原理
2018-03-01 17:58
525 查看
双端队列(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)迭代器的原理与实现
- 常见排序的原理和C++实现(一)——STL库中sort的使用方法
- C/C++知识要点2——STL中Vector、Map、Set容器的实现原理
- C/C++知识要点2——STL中Vector、Map、Set容器的实现原理
- C++ STL next_permutation的实现原理
- C++ STL next_permutation的实现原理
- [C++]STL vector list deque区别与实现
- C++ STL库的总结以及实现原理
- c++智能指针的原理与简单实现
- STL中vector,Map,Set的实现原理
- 线程池原理及创建(C++实现)
- 协程概念,原理及实现(c++和node.js实现)
- STL中vector, Map, Set的实现原理
- stl容器区别: vector list deque set map-底层实现
- C++ STL_(1)deque
- C++ 多态的实现及原理