list和vector及deque的区别

昨天面试的时候被问到list和vector的区别,仓促之间感觉说的条理有点混乱,回来总结一下,顺便也把deque的一些特点回忆一下:

 

 

vector是一段连续的内存,其元素顺序存储在这段内存中,vector支持高效的随机访问,因为它所有元素到首地址的位移是固定的,但是当在vector的随机位置而不是尾部移除或插入一个元素时,其效率是很低的,因为它需要将当前位置之后的元素全部向前或向后移动一个位置。这种消耗在vector的元素是大型的复杂类的对象时尤其难以忍受。另外有一点就是vector在尾部的插入速度会在刚好到达其已申请空间的尾部时变的很低,因为vector会在这个时候进行内存的重新分配。

 

deque也是一段连续内存,但是不同的是,deque支持在其首部高效的移除和插入元素,因为deque是通过两级数组结构实现的,一级是表示实际的容器,另一级则指向容器的首部和尾部。

 

而list在内存中则是离散存储的,它的每个节点通过一个前指针和一个后指针连接起来,从而允许向前和向后进行遍历,但是list对随机访问的支持性不好,因为它总是要遍历之前所有的节点直到找到要访问的节点。list 支持较快的在任意位置插入或删除一个元素。每当一个新对象被插入到list 中时,插入处的两个元素的前指针和后指针被重新赋值为指向新对象,新对象的前后指针被初始化为指向这两个元素。当一个元素要被删除时,只需将该元素前一个元素的后指针指向该元素的下一个元素,将该元素后一个元素的前指针指向该元素的前一个元素即可。另外,list的每个元素还需要2个指针的额外开销。

 

所以,当我们需要频繁的随机访问时,vector是一个更好的选择

当存储元素的个数是已知的时候,vector也是一个更好的选择

当我们需要的不止是在容器的首尾插入和删除元素的时候,list显然是更明智的选择

如果我们仅仅会在容器的首部频繁进行插入删除,那么deque绝对是第一选择

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值