vector和list的区别

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-需要进行大量插入和删除操作 不关心随机访问

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值