昨天面试的时候被问到list和vector的区别,仓促之间感觉说的条理有点混乱,回来总结一下,顺便也把deque的一些特点回忆一下:
vector是一段连续的内存,其元素顺序存储在这段内存中,vector支持高效的随机访问,因为它所有元素到首地址的位移是固定的,但是当在vector的随机位置而不是尾部移除或插入一个元素时,其效率是很低的,因为它需要将当前位置之后的元素全部向前或向后移动一个位置。这种消耗在vector的元素是大型的复杂类的对象时尤其难以忍受。另外有一点就是vector在尾部的插入速度会在刚好到达其已申请空间的尾部时变的很低,因为vector会在这个时候进行内存的重新分配。
deque也是一段连续内存,但是不同的是,deque支持在其首部高效的移除和插入元素,因为deque是通过两级数组结构实现的,一级是表示实际的容器,另一级则指向容器的首部和尾部。
而list在内存中则是离散存储的,它的每个节点通过一个前指针和一个后指针连接起来,从而允许向前和向后进行遍历,但是list对随机访问的支持性不好,因为它总是要遍历之前所有的节点直到找到要访问的节点。list 支持较快的在任意位置插入或删除一个元素。每当一个新对象被插入到list 中时,插入处的两个元素的前指针和后指针被重新赋值为指向新对象,新对象的前后指针被初始化为指向这两个元素。当一个元素要被删除时,只需将该元素前一个元素的后指针指向该元素的下一个元素,将该元素后一个元素的前指针指向该元素的前一个元素即可。另外,list的每个元素还需要2个指针的额外开销。
所以,当我们需要频繁的随机访问时,vector是一个更好的选择
当存储元素的个数是已知的时候,vector也是一个更好的选择
当我们需要的不止是在容器的首尾插入和删除元素的时候,list显然是更明智的选择
如果我们仅仅会在容器的首部频繁进行插入删除,那么deque绝对是第一选择