C++怎么用map C++中map和unordered_map区别【对比】

4次阅读

C++怎么用map C++中map和unordered_map区别【对比】

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_rangefind() 返回 end() —— 和 map 行为一致。但注意:unordered_mapend() 迭代器不能解引用,也不保证等于 nullptr

  • 别写 if (umap[key]) 判断存在性——这会静默插入 key
  • 哈希冲突多或负载因子高时,find() 性能可能退化到 O(n),不是稳定 O(1)
  • 自定义类型作 key 时,必须提供 std::hash<t></t> 特化 + operator==,缺一不可

map 和 unordered_map 迭代器失效规则完全不同

map 的迭代器只在对应元素被 erase() 时失效;其他操作(insertclear)不影响已有迭代器有效性。而 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

实际用哪个,得看 key 分布、操作模式、是否依赖顺序——不是哈希就一定快,也不是红黑树就一定慢。尤其小数据量(比如 map 的常数反而可能更低。

text=ZqhQzanResources