4.15

今日
写老题,归纳不足
一、unordered_map 核心底层
底层是哈希表,和 map(红黑树)完全不同:
靠哈希函数把键转成下标存储
无序、查找 O (1)
对 键 有严格要求,对 值 无要求

二、键 (Key) 的 5 大存储规则

  1. 必须有默认哈希函数 hash
    这是最核心规则!
    C++ 自带哈希的类型(可以当键):
    int / long long / char / bool / string / 指针
    C++ 没有默认哈希的类型(不能直接当键):
    vector / pair / 自定义结构体 / set
  2. 必须支持 == 比较
    用来判断两个键是否重复,基本类型 /string 都支持,自定义类型需要重载 ==。
  3. 键唯一,不可重复
    同一个键只能存一份,重复插入会覆盖原来的值。
  4. 存储无序
    不会按大小 / 插入顺序排序,遍历顺序是随机的。
  5. 键不可修改
    键一旦存入,不能改!改了哈希值就变了,容器直接崩溃。想改只能:删除旧键 → 插入新键。

map/unordered_map
map 输出:有序
底层:红黑树
规则:按键的升序自动排序
数字键:从小到大
字符串键:字典序
vector 做键:按向量字典序排序
和你插入的顺序无关
2. unordered_map 输出:完全无序O(1)
底层:哈希表
规则:随机顺序
既不按插入顺序,也不按键大小
每次运行输出顺序可能都不一样

  1. map 靠大小比较排序、存储
    map 不需要哈希,只需要知道两个键谁大谁小,就能把数据存在红黑树里。

为什么 unordered_map 不能存 vector 做键?

  1. C++ 没有给 vector 提供默认的哈希函数
    哈希表需要把键转成一个数字(哈希值),才能存数据。int/string 有默认哈希,vector 没有!
  2. 缺少哈希函数 → 直接编译报错
    unordered_map 存不了没有哈希的类型,哪怕你能比较大小也没用。

map 要的是「能比大小」→ vector 自带 <,所以能当键
unordered_map 要的是「能算哈希」→ vector 没默认哈希,所以不能当键

拓展
如果一个类型:
支持 < → 能放 map
支持哈希 → 能放 unordered_map
举例:
int:两者都能放
vector:只能放 map
pair:只能放 map
自定义结构体:想放 map 重载 <,想放 unordered_map 要手写哈希

posted @ 2026-04-15 22:37  douzishuo  阅读(26)  评论(0)    收藏  举报