
map 插入和查找必须用 operator[] 或 at() 吗?
不是。用 operator[] 会默认构造不存在的 key,可能触发意外初始化(比如 std::map<int std::vector>></int> 中访问不存在 key 会生成空 vector);at() 抛异常,适合明确要求存在性的场景。更安全通用的做法是用 find():
-
find()返回iterator,查不到就是end(),不修改容器 - 插入优先用
insert()或 C++17 的try_emplace()(避免临时对象构造) -
emplace()直接在节点内存里构造 value,比insert({k, v})少一次拷贝/移动
unordered_map 查不到 key 时返回什么?
operator[] 会插入默认构造的 value 并返回引用;at() 抛 std::out_of_range;find() 返回 end() —— 和 map 行为一致。但注意:unordered_map 的 end() 迭代器不能解引用,也不保证等于 nullptr。
- 别写
if (umap[key])判断存在性——这会静默插入 key - 哈希冲突多或负载因子高时,
find()性能可能退化到 O(n),不是稳定 O(1) - 自定义类型作 key 时,必须提供
std::hash<t></t>特化 +operator==,缺一不可
map 和 unordered_map 迭代器失效规则完全不同
map 的迭代器只在对应元素被 erase() 时失效;其他操作(insert、clear)不影响已有迭代器有效性。而 unordered_map 更敏感:
-
rehash(如扩容)会导致所有迭代器失效,哪怕没删元素 -
max_load_factor()设置过低会频繁 rehash;设太高则查找变慢 -
reserve(n)可预分配桶数,减少运行时 rehash 次数
什么时候该选 map 而不是 unordered_map?
当需要按 key 有序遍历、范围查询(比如 lower_bound)、或 key 类型没有合适哈希函数时,map 是唯一选择。另外:map 的内存布局更紧凑(红黑树节点指针开销固定),unordered_map 则有哈希桶数组 + 链表/红黑树双重结构,空载时也占更多内存。
立即学习“C++免费学习笔记(深入)”;
- key 是
int/std::string且只做单点查找?优先unordered_map - 要遍历 [100, 200) 区间内所有 key?只能用
map::lower_bound+upper_bound - 编译器不支持 C++11 以上?
unordered_map可能不可用,得 fallback 到map









