vector与list的区别
1. 两者的定义
vector
连续存储的容器,动态数组,在堆上分配空间。底层数据结构是数组
vector两倍容量增长
vector插入元素时,如果未超过当时的容量,则直接添加到最后,然后调整迭代器
vector插入元素时,如果超过当时的容量,会重新分配两倍原来大小的空间,然后将原空间的元素通过复制的方式初始化新的空间,再向新空间增加元素时。最后析构并释放原有的空间,之前的迭代器也会失效
list
动态链表,在堆上分配空间。底层数据结构是双向链表
2. 两者区别
比较项 | vector | list |
---|---|---|
底层实现 | 数组 | 双向链表 |
随机访问 | 支持 | 不支持 |
顺序内存 | 是 | 不是 |
顺序内存 | 是 | 不是 |
中间插入是否存在内存拷贝 | 有可能会,比如空间不够的情况 | 不会 |
内存分配策略 | 一次性分配好,不够时才进行2倍扩容 | list每次插入都会进行内存申请 |
插入性能 | 在最后插入(空间够),很快;在最后插入(空间不够),需要内存申请和释放,以及对之前数据进行拷贝 | 很快,一般是常数开销 |
删除性能 | 在最后删除很快;删除中间元素需要移动其它元素 | 很快,一般是常数开销 |
删除性能 | 在最后删除很快;删除中间元素需要移动其它元素 | 很快,一般是常数开销 |
适用场景 | 经常随机访问,且不经常对非尾节点进行插入删除 | 经常删除大量数据 |
3. 应用场景
vector 拥有一块连续的内存,因此支持随机访问,如果需要高效率的访问,而不在乎插入和删除的效率,使用vector
list拥有一段不连续的内存空间,如果需要高效率的插入和删除,而不关心访问效率,使用list