一:基本定义
vector:
基于连续内存的动态数组。
提供随机访问。
list:
基于双向链表
每个元素是一个节点,节点间通过指针连接,支持任意位置插入和删除
二:底层数据结构
vector:
元素存储在连续的内存块中。
内部维护三个指针:begin,end,capacity
当容量不足时,重新分配更大内存并复制元素
list:
元素存储在非连续的节点中,每个节点包含数据、前指针和后指针。
节点间通过指针链接,形成双向链表
内存分配是分散的,按需分配。
三:内存布局
vector:
连续内存,元素紧凑排列。
优点:访问效率高
缺点:插入删除需移动元素
list:
非连续内存,节点分散。
优点:插入删除只需调整指针
缺点:访问效率低
四:访问方式
vector:
支持下标随机访问
时间复杂度:O(1)
list:
不支持随机访问,只能遍历。
访问第n个元素时间复杂度:O(n)
五:插入和删除
vector:
尾部:push_back和pop_back是O(1)(可能触发扩容)
中间/头部:insert和erase是O(n),需要移动元素。
扩容时可能重新分配内存并拷贝所有元素。
list:
任意位置:insert和erase是O(1),只需调整指针。
不涉及内存重新分配。
六:内存管理
vector:
预分配容量capacity,通过reserve可减少重新分配。
扩容时通常按倍增(如2倍)分配。
list:
按需分配,每个节点独立申请内存。
无需预分配。
七:迭代器失效
vector:
插入可能导致扩容,使所有迭代器失效。
删除或插入(非尾部)使后序迭代器失效。
list:
插入和删除只影响当前节点的迭代器。
八:元素存储开销
vector:
仅存储元素本身,无额外指针。
内存效率高。
list:
每个节点存储数据、前指针后指针
内存效率低。