vector
优点
支持下标随机访问 间接支持排序 二分查找(因为vector的底层结构为动态顺序表 在内存上是连续存储的)
vector的缓存命中率高(在内存上是连续存储的,预加载机制-访问一个数据时不会只加载这一个数据到缓存而是加载一段数据到缓存)
缺点
头部和中间的插入删除效率低 为O(N)(因为需要挪动数据)只适合尾插尾删
插入数据可能需要增容 代价大(开辟新空间 拷贝数据 释放旧空间)
list
list为了解决vector的缺陷
优点
头部和中间插入效率高 为O(1)(因为不需要挪动数据 底层结构是带头结点的双向循环链表 以节点为单位存储 节点动态开辟)
list插入数据是新增节点 不需要增容
缺点
不支持下标随机访问
缓存命中率低 有内存碎片问题
随机访问
空间利用率
插入删除
应用场景
1.底层结构
vector的底层结构为动态顺序表,是一段连续的空间;
list底层结构为带头结点的双向循环链表;
2.随机访问√
vector支持随机访问 效率为O(1);
不支持随机访问 效率为O(N);
3.插入和删除√
vector的插入删除效率低 为O(N)-因为需要挪动元素;并且插入有可能需要增容-开辟新空间 拷贝元素 释放旧空间 导致效率更低;
list任意位置插入删除效率高 为O(1) 不需要挪动元素;
4.空间利用率√
vector底层为连续空间 不容易造成内存碎片 空间利用率高 缓存利用率高
list底层节点动态开辟 小节点容易造成内存碎片 空间利用率低 缓存利用率低
5.迭代器
vector为原生态指针
list对原生态指针进行封装
6.迭代器失效
vector插入删除元素会导致迭代器失效 因为插入元素可能会导致扩容-vector底层原有旧空间被释放-而it还使用的是被释放的旧空间;删除的元素pos如果是最后一个元素 删完之后 pos刚好是end的位置 而end的位置是没有元素的 因此迭代器失效
list插入元素不会导致迭代器失效;删除元素时 只会导致当前迭代器失效 其他迭代器不受影响
7.使用场景√
vector-需要高效存储 支持随机访问 不关心插入删除效率
list-需要进行大量插入和删除操作 不关心随机访问