关联式容器初探
首先回顾一下 unordered_map 和 unordered_set,它们基于哈希表实现,用法与红黑树版本的 map/set 类似。主要区别在于:迭代器是单向的,且遍历时数据无序。

它支持去重,也有 multi 版本。unordered_map 同样遵循这一特性。
哈希的核心思想
哈希的本质是在存储的值与位置之间建立映射关系。相比暴力查找的低效和二分查找对有序性的依赖,哈希提供了 O(1) 的平均查找复杂度。
例如计数排序中,最小值 15 映射到索引 0,最大值 30 映射到对应位置。这种直接定址法适用于数据分布集中的场景。若数据分散,可采用除留余数法:i = key % 空间大小。

此时会面临哈希冲突问题,即不同 Key 映射到同一位置。解决冲突主要有两种方式:闭散列(开放定址法)和拉链法(哈希桶)。

闭散列——开放定址法
当发生冲突时,闭散列会在表中寻找下一个可用位置。常见策略包括线性探测和二次探测。
以线性探测为例,若当前位置被占,则向后查找空位。若遍历完未找到,则绕回开头继续查找。

删除操作的陷阱
直接删除元素会导致后续查找中断(遇到空位就停止)。因此需引入状态标记:EXIST(存在)、EMPTY(空)、DELETE(已删除)。查找时跳过 DELETE,直到遇到 EMPTY 才停止。
enum STATE { EXIST, EMPTY, DELETE };
template<class K, class V>
struct HashData {
pair<K, V> _kv;
STATE _state = EMPTY;
};



