这个问题的本质还是在问顺序表和链表的区别
底层结构不同
vector容器list容器
一段连续的空间带头结点的双向循环链表
元素访问方式
vector容器list容器
支持随机访问—O(1)不支持随机访问—O(N)需要扩容不需要扩容任意位置插入元素----O(N)–搬移元素O(1)
迭代器不同
vector容器list容器
类型:原生态的指针对原生态指针进行封装失效的场景:导致底层空间改变操作当前迭代器对应的结点没有了erase(it)erase(it)
空间
vector容器list容器
需要扩容不需要扩容不扩容的话空间利用率高,扩容不一定不扩容的话空间利用率低,扩容不一定vector如果不new是在栈上的list结点是new出来的,频繁向系统申请小的内存块,可能会存在内存碎片。new的底层是malloc,可能会有额外空间的浪费
缓存利用率
vector容器list容器
比如上面的图,cpu加载1时有可能把12345全部加载到缓存中,这样效率更高,底层连续而list加载时,一次性加载可能就一两个元素,底层不连续
应用场景
vector容器list容器
高效存储—访问任意位置插入和删除操作比较多
接口不同
vector没有push_front,和pop_front,因为它头插和头删的效率比较低
转载请注明原文地址: https://mac.8miu.com/read-485424.html