map, set 和 unordered_map 的底层实现及其区别
1. map 和 set底层实现
- map: 底层实现通常使用 红黑树(也称为自平衡二叉搜索树)。
- set: 底层实现也通常使用 红黑树。
特性
- 有序: 元素存储在有序结构中,具有按键值或元素值排序的特性。
- 时间复杂度: 插入、删除、查找的时间复杂度平均和最差情况下都是 (O(\log n))。
- 迭代器稳定性: map 和 set 的迭代器在插入和删除操作中是稳定的(即指向未被删除元素的迭代器仍然有效)。
2. unordered_map 和 unordered_set
底层实现
- unordered_map: 底层实现使用 哈希表(也称为散列表)。
- unordered_set: 底层实现同样使用 哈希表。
特性
- 无序: 元素存储在无序结构中,不保证元素的顺序。
- 时间复杂度: 插入、删除、查找的平均时间复杂度是 (O(1)),但在最差情况下(哈希冲突严重时)可能会退化到 (O(n))。
- 迭代器稳定性: unordered_map 和 unordered_set 的迭代器在插入操作中是稳定的,但在删除操作中可能会失效。
map vs unordered_map 的效率比较
何时 unordered_map 比 map 效率高
- 一般情况下: unordered_map 在查找、插入和删除操作上通常比 map 更快,因为其平均时间复杂度是 (O(1))。
- 大数据情况下: 当数据量很大且哈希函数设计合理时,unordered_map 的性能优势更加明显。
何时 map 比 unordered_map 效率高
- 最坏情况下: 如果哈希函数不够好,导致大量哈希冲突,unordered_map 的性能可能会退化到 (O(n)),此时 map 可能会表现得更好,因为其时间复杂度始终是 (O(\log n))。
- 需要元素有序: 如果需要元素有序访问,map 是唯一选择,因为 unordered_map 无法保证元素顺序。
- 迭代器的稳定性和内存使用: 在某些情况下,map 的迭代器稳定性和内存使用更可预测。
总结
- map和 set: 基于红黑树,提供有序存储,操作复杂度为 (O(\log n))。
- unordered_map和 unordered_set: 基于哈希表,提供无序存储,平均操作复杂度为 (O(1)),但最坏情况下为 (O(n))。
- 效率: unordered_map 通常比 map 更高效,但在哈希冲突严重或需要有序存储时,map 可能更适合。