Vector:(顺序表【数组存储】)
1.当申请的空间不足的时候,需要再次开辟一块更大的空间,并把值拷过去。
2.对于尾删和尾插是比较方便的,只需要改动最后一个元素即可。不会改动原有的空间。适用于多次重复的对尾部插删。
3.顺序存储,地址是连续的。
4.头插和头删都需要移动一定的大小。时间复杂度为o(N)。而链表只需o(1)。
List:(链表)
1.需要每次都创建节点。
2.适用于头删尾插,但是不适用于多次重复的插删,因为每次都得创建节点,释放节点,消耗是比较大的。
3.非顺序存储,地址不连续。
4.由于节点之间地址是不连续的,所以会产生内存碎片问题。
如图:
List和Vector还有一个重要的点是:
Vector的CPU缓存利用率比链表高。
简单阐述一下:
那么,Vector/List与Stack/Queue有什么联系呢?
Stack:[栈](后进先出)
对于栈来说,后进先出,所以是对尾部进行插删操作,和Vector(尾插尾删较方便)是类似的。
Queue:[队列](先进先出)
对于队列来说,是先进先出的。所以,对头部删除,尾部插入是比较方便的,刚好和链表(List)是类似的。
一般情况下,我们会用Vector来模拟实现栈;用List来模拟实现队列。