⚡
STL 与迭代器
6 篇文章
查看专题概览 / 复习建议
核心问题
- 常用容器底层结构和复杂度分别是什么
vector为什么扩容后可能导致迭代器失效unordered_map的冲突处理和 rehash 机制是什么- 红黑树为什么适合关联式容器
- 不同容器的适用场景和性能特征
- 迭代器分类和失效规则
- 算法与容器的配合使用
- 自定义类型的容器使用注意事项
建议复习顺序
- 顺序容器(vector扩容与迭代器失效)
- 哈希容器(unordered_map与哈希冲突)
- 关联容器(红黑树与关联容器)
- 常用容器对比与选型
- 迭代器分类与失效规则
- 算法与仿函数(综合应用)
子主题导航
高频追问
- 为什么
vector不适合频繁头插 unordered_map为什么可能退化set和unordered_set怎么选- 为什么插入不一定会让所有迭代器失效
- 输入迭代器、前向迭代器、随机访问迭代器有什么区别
vector、deque、list应该怎么选- 为什么 STL 算法和容器是分离设计
- 不同容器的时间复杂度对比
- 如何选择合适的容器类型
- 自定义类型如何支持容器操作
易错点
- 只背复杂度,不讲底层结构
- 把引用失效和迭代器失效混成一件事
- 认为哈希表一定比树结构更快
- 只会背容器结论,不会根据访问模式做选型
- 忽略不同容器的内存布局差异
- 不理解迭代器失效的具体条件
- 在循环中修改容器导致迭代器失效
学习策略
记忆技巧
容器选择口诀:
- vector = “连续内存,随机访问快”
- list = “链表结构,插入删除快”
- map = “红黑树,有序查找”
- unordered_map = “哈希表,平均O(1)”
性能对比:
- 查找:unordered_map(平均O(1)) > map(O(log n)) > vector(O(n))
- 插入:list(O(1)) > unordered_map(平均O(1)) > map(O(log n))
- 内存:vector(紧凑) > map(指针) > unordered_map(桶+链)
关联学习
STL与迭代器与前面的知识紧密相关:
- 模板与泛型:所有容器都是模板类
- 移动语义:容器操作中的性能优化
- 类型系统:自定义类型的容器支持
- 内存管理:容器的内存分配策略
建议结合具体使用场景来理解不同容器的设计取舍。