C++STL系列--1.顺序容器vector,list,deque

容器的定义

容器,置物置所也。
容器通俗来讲就是一种数据结构。
STL提供了一组顺序容器:vector,list,deque,stack,queue,priority_queue;其中stackqueue只是deque改头换面而成,内部的数据结构还是deque

vector容器

vector的数据和array非常相似。但是array是静态空间,一旦配置就不能改变;需要扩容的时候需要手动扩容,非常麻烦;而vector是动态空间,随着元素的加入,内部机制会自动扩容空间容纳新元素。
vector采用的数据结构很简单:线性连续空间。用两个迭代器start和finish分别指向配置空间中已被使用的范围,end_of_storage指向整块连续空间的末尾。

vector的元素操作:

poc_back,erase,clear,insert等几种。

vector容器底层是线性连续空间,和数组类似,所以具有数组的优点:

  1. 可以快速的在尾部插入或者删除元素
  2. 可以直接访问容器中的所有元素。

但是,根据数组的特点,vector容器在按位置插入或者删除的时候效率很低,因为数组的位置确定,按位置插入需要移动很多元素,时间复杂度是O(n);

vector容器的扩容

vector容器的扩容分为以下四步:

  1. 以倍数的形式开辟2倍的空间。
  2. 把所有的旧数据拷贝到新空间之中。
  3. 释放旧数据空间
  4. 指向新空间并且调整大小。
    在这里插入图片描述
    虽然和数组一样需要扩容并且搬迁,但是这一步是自动的,不需要程序员手动参与并且释放空间。所以,对vector的任何操作,一旦引起空间重新配置,指向原来vector的所有迭代器就都会实效。

list容器

list容器的底层实现是一个环状双向链表。根据特点,list每次插入或者删除一个元素,就配置或者释放一个元素空间。所以,list对于空间的运用绝对精准,不会浪费。而且对于任何位置的元素进行插入或者移除,永远是O(1)的时间复杂度。
list的元素操作: push_front,push_back,insert,erase,pop_front,pop_back,clear,reverse,sort等都是O(1)的时间复杂度。但是特殊的环状双向链表结构,导致list容器中的元素查询和访问将是O(n)的时间复杂度,因为底层实现是一个一个的去对比,直到找到要访问的元素。在这里插入图片描述

deque容器

vector是单向开口的连续线性空间,而deque是一种双向开口的连续线性空间,在头尾两端都可以进行元素的插入和删除操作。在这里插入图片描述
deque和vector的最大两点差异:

  1. deque允许直接对头段进行元素的插入或者移除。
  2. deque没有容量的观念。随时可以增加一段空间连接起来

deque室友一段一段的定量连续空间构成,一旦有必要在deque的前端或者尾部串接新空间。这种空间模式避开了“重新配置,复制、释放”的轮回,但是却使得deque的迭代器设计变得复杂。

deque采用的是一块map指针数组,里边的每个元素都指向以苦熬较大的连续线性空间,成为缓冲区,而这块缓冲区才是储存的空间主体,一般来说,默认这块空间主体是512比特大小。在这里插入图片描述
deque除了维护map指针数组之外,也维护start。finish连个迭代器,分别指向第一缓冲区和第一个元素和最后缓冲区的最后一个元素。

deque缓冲区扩充操作相当复杂:
首先当push_back()尾插时,当缓冲区满了之后,push_back()会调用push_back_aux()来重新配置一块新得缓冲区,并同时更新迭代器finish的状态。在这里插入图片描述
而头插满了之后,会首先把map往下移动,然后向上开辟缓冲区,从后往前插入,并更新start迭代器的状态。在这里插入图片描述

deque的元素操作和效率

在这里插入图片描述
可以看见,deque在头插尾插。头删尾删的时候都是O(1)的时间复杂度,容器元素访问也是O(1)的时间复杂度。但是在erase和insert都是O(n)的时间复杂度。

总结

vector底层实现和数组类似,它的迭代器是随机访问迭代器,并且只支持尾部快速的插入或者删除元素,并且可以访问任何元素;而list的底层实现是双向环状链表,迭代器类型是双向迭代器,任意位置快速的插入或者删除,但是直接访问时的效率比较低; deque是底层双端队列,并且并不连续,支持随机访问迭代器,支持头部或者尾部的快速插入或者删除,随机访问的效率也很高,但是内部插入或者删除的效率很低。

猜你喜欢

转载自blog.csdn.net/ALITAAAA/article/details/114480766
今日推荐