C++ vector /list/map 完整对比与用法

📅 2026/7/1 7:41:28
C++ vector /list/map 完整对比与用法
一、底层数据结构vector动态数组底层连续内存数组一块完整堆内存自动扩容。list双向链表底层双向不连续链表每个节点存数据 前后指针内存分散。map有序红黑树底层红黑平衡二叉树按键 key 自动升序排序键唯一不可重复。二、核心性能对比时间复杂度表格操作vectorlistmap随机访问[]/at()O (1) 极快不支持随机访问不支持随机访问头部插入 / 删除O (n)整体移位O (1) 极快O(log n)尾部插入 / 删除均摊 O (1) 极快O(1)O(log n)中间插入 / 删除O (n)大量移位O(1)O(log n)按值查找O (n) 遍历O (n) 遍历按键查找 O (log n)内存开销小仅存数据大额外存双向指针大树平衡额外标记三、基础代码示例1. vector 动态数组优先日常容器适用频繁随机读写、尾部增删很少中间插入#include vector #include iostream using namespace std; int main() { vectorint vec; vec.push_back(10); // 尾部添加 vec.push_back(20); vec.insert(vec.begin(), 5); // 头部插入效率低 cout vec[1]; // 随机访问 O(1) // 遍历 for (int x : vec) cout x; return 0; }2. list 双向链表适用频繁头部 / 中间增删几乎不随机读取#include list int main() { listint lst; lst.push_back(1); lst.push_front(0); // 头部插入很快 // 无 lst[0] 这种随机访问只能迭代器遍历 for (auto it lst.begin(); it ! lst.end(); it) {} return 0; }3. map 有序键值对适用需要key 自动排序、按键快速查找、键不重复#include map int main() { mapstring, int mp; mp[张三] 18; mp[李四] 20; // 自动按字符串升序排列按键查询O(logn) cout mp[张三]; return 0; }四、优缺点总结vector✅ 优点随机访问超快、缓存友好、内存紧凑、遍历速度最快 ❌ 缺点头部 / 中间插入删除大量元素移位扩容会拷贝数据场景数组、缓存、数据批量存储、绝大多数业务首选list✅ 优点任意位置插入删除仅修改指针无内存拷贝 ❌ 缺点不支持随机访问遍历慢、内存碎片多、缓存不命中场景频繁中间增删、队列节点管理、极少查询下标map✅ 优点key 有序按键二分查找插入删除稳定 logn 复杂度 ❌ 缺点不能下标随机遍历 value树结构内存开销大场景字典、有序映射、需要按 key 快速检索的配对数据五、选型快速口诀要下标随机取数据 →vector频繁在中间 / 头部删改不用下标 →list存 key-value、需要自动排序、按键查找 →map