std::map 是 C++ 标准模板库(STL)中的一个关联容器,它存储键值对(key-value pairs),并根据键(key)自动排序。
键值对存储:
- 每个元素是一个 std::pair<const Key, T>,其中 Key 是键的类型,T 是值的类型。
- 键是 const 的,一旦插入就不能修改(否则会破坏排序)。
唯一性与有序性:
- 每个键都是唯一的。尝试插入重复的键会失败(或覆盖旧值,取决于插入方式)。
- 元素根据键自动按升序排列(默认使用 std::less<Key>)。这使得遍历时按键有序。
基于平衡二叉搜索树:
- 底层通常使用**红黑树(Red-Black Tree)**实现。这保证了操作的稳定性能。
这种数据结构使得`map`在进行查找时的效率非常高。此外,`map`的插入操作对其他节点的干扰非常小,
这得益于它在插入新节点时会通过哈希函数找到相应的位置,然后更新链表,从而避免了整个树结构的移动。
对数时间复杂度:
- 查找、插入、删除操作的平均和最坏时间复杂度均为 O(log n)。
直接通过键访问:
- 可以使用 operator[] 像数组一样通过键访问值,如果键不存在,会自动创建一个默认初始化的值。
std::unordered_map 是 C++ 标准模板库(STL)中的一个关联容器,它是 std::map 的无序版本,底层基于哈希表(Hash Table)实现。
键值对存储:
- 和 std::map 一样,每个元素是一个 std::pair<const Key, T>。
- 键是唯一的且为 const。
唯一性与无序性:
- 每个键都是唯一的,重复插入会失败或覆盖。
- 元素的存储顺序是无序的,由哈希函数决定,不反映键的大小关系。
基于哈希表 (Hash-based):
- 使用哈希函数将键映射到内部的“桶(bucket)”中。
- 同一个桶内的元素通过链表或其它方式解决冲突。
平均常数时间复杂度 :
- 查找、插入、删除操作的平均时间复杂度为 O(1)。
- 最坏情况为 O(n)(例如,所有键都哈希到同一个桶,发生严重冲突)。
直接通过键访问:
- 支持 operator[] 和 at() 通过键访问值,行为与 std::map 相同。