vector和list容器有哪些区别

这个问题的本质还是在问顺序表和链表的区别

底层结构不同

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容器有哪些区别

vector容器 list容器
比如上面的图,cpu加载1时有可能把12345全部加载到缓存中,这样效率更高,底层连续 而list加载时,一次性加载可能就一两个元素,底层不连续

应用场景

vector容器 list容器
高效存储—访问 任意位置插入和删除操作比较多

接口不同

vector没有push_front,和pop_front,因为它头插和头删的效率比较低