vector、list、deque的优缺点

文章目录

  • vector、list、deque容器的优缺点
    • vector:
    • list:
    • deque:
  • stack、queue、priority_queue的默认实现容器
    • stack:默认实现:deque
    • queue:默认实现:deque
    • priority_queue:默认实现:vector
  • 对duque双端队列的简要介绍

vector、list、deque容器的优缺点

vector:

优点:随机访问,尾部的操作O(1),空间利用率高,不容易造成内存碎片
缺点:中间头部操作O(n),增容代价比较大(深拷贝)每次都要重新开辟一个更大空间进行数据搬移。

list:

优点:任意位置操作性能高,插入删除O(1)
缺点:不支持随机访问,空间利用率比较低(频繁的申请释放),容易造成内容碎片。

deque:

优点:支持随机访问(性能略低于vector),头部尾部的操作O(1),增容的代价小
缺点:中间位置的操作性能比较低:O(n)

stack、queue、priority_queue的默认实现容器

stack:默认实现:deque

堆的实现可以用vector,list,deque
因为stack的实现不需要随机访问,因此vector的优势体现不出来,并且list空间利用率较低。

queue:默认实现:deque

队列的实现可以用list,deque
队列只在头部和尾部操作,因此deque中间操作性能低不受影响。list空间利用率低需要频繁申请释放。

priority_queue:默认实现:vector

优先队列的实现可以用vector,deque
需要容器支持随机访问(因为要实现元素的交换),vector的元素都在连续位置(物理连续),随机访问是O(1)的操作,遍历是O(n)的操作。deque虽然支持随机访问,但是它的性能略低于vector。元素不是完全连续。

对duque双端队列的简要介绍

deque(双端队列):增容代价小
1.数据缓冲区已满,新开一个缓冲区,缓冲区首地址存入指针数组
2.指针数组已满,新开一个指针数组,只需要拷贝原有缓冲区的指针,不需要拷贝元素内容

通俗解释:创建一个指针数组,从中间开始存储,比如chunk1 指向一个数据缓冲区用来存储数据,当进行头插尾插占满该缓冲区后,**再进行头插时,对指针数组进行–,chunk0指向一块新的数据缓冲区用来存储头插操作;再进行尾插时,对指针数组进行++,chunk2指向一块新的数据缓冲区用来存储尾插操作。**当指针数组满了之后,从新开辟一个更大的指针数组,将原先数组内元素copy过去,这样的操作不用进行数据的搬移,只用进行指针的搬移。

vector、list、deque的优缺点_第1张图片

你可能感兴趣的:(c++,数据结构)