在嵌入式 Linux / C++ 面试中,STL 容器几乎是必问内容。面试官不仅关心你'会不会用',更关心你是否理解:
- 底层数据结构是什么?
- 性能差异在哪里?
- 什么时候该用 map,什么时候该用 unordered_map?
1. map 和 set 有什么区别?是如何实现的?
1.1 相同点
- 都是 关联式容器
- 底层实现:红黑树(RB-Tree)
- 元素自动有序
- 插入、删除、查找时间复杂度:
O(logN)
1.2 不同点对比
| 对比项 | map | set |
|---|---|---|
| 存储结构 | key-value | key |
| 是否允许修改 | value 可改 | 不可改 |
| 迭代器 | 非 const | const |
| 是否支持下标 | 支持 | 不支持 |
1.3 为什么不能修改 key?
map/set 的有序性依赖 key:
- 修改 key → 破坏红黑树结构
- 需要删除 + 重新插入
- 会导致迭代器失效
设计结论: STL 从接口层面直接禁止修改 key,保证容器稳定性。
2. map 的 operator[] 为什么要慎用?
map<int, int> m;
m[10]; // 若 key 不存在,会插入一个 value=0 的元素
注意点
- 会 隐式插入元素
const map不能使用mapped_type无默认构造函数时不可用- 仅用于 确认存在性 时不推荐
✅ 推荐做法:
auto it = m.find(10);
if (it != m.end()) {
// 处理逻辑
}


