C++——unordered_map

std::unordered_map 是 C++ 标准库中的一个关联容器,用于存储键值对。它基于哈希表实现,提供了快速查找、插入和删除操作的能力。

一、unordered_map的特点

1. 无序存储:std::unordered_map 中的元素是无序的,即不会按任何特定顺序排列。这是因为它使用哈希表作为底层数据结构,元素的存储位置由其键的哈希值决定。

2. 快速查找:std::unordered_map 提供了平均情况下的常数级查找时间复杂度(O(1)),但在最坏情况下可能退化为线性级(O(n)),特别是在哈希冲突严重的情况下。这使得std::unordered_map 非常适合需要快速查找键值对的应用场景。

3. 键的唯一性:std::unordered_map 中不允许重复的键。如果试图插入一个已存在的键,则会更新该键对应的值。

4. 键值对的存储:每个元素都是一个键值对,形式为 (key, value)。

二、内部实现

1. 哈希函数:用于计算键的哈希值,std::unordered_map 默认使用 std::hash<Key> 来计算键的哈希值。用户也可以提供自定义的哈希函数。

2. 等价函数:用于判断两个键是否相等,std::unordered_map 默认使用 std::equal_to<Key> 来比较键。用户也可以提供自定义的等价函数。

3. 桶的数量:哈希表由多个“桶”(bucket)组成,每个桶可以包含一个或多个键值对。std::unordered_map 会根据元素数量动态调整桶的数量,以减少哈希冲突。

4. 负载因子:负载因子(load factor&#x

### C++ 中 `unordered_map` 和 `map` 的区别 #### 数据结构 `map` 是基于红黑树(一种自平衡二叉查找树)实现的数据结构,因此其内部存储的键值对是按照键的顺序排列的。而 `unordered_map` 则是基于哈希表实现的,这意味着它的键值对是没有固定顺序的[^2]。 #### 键的唯一性和重复性 `map` 要求所有的键必须是唯一的,并且这些键会自动按升序或降序排列(取决于模板参数中的比较器)。相比之下,`unordered_map` 同样要求键是唯一的,但它不会对键进行排序,而是通过哈希函数定位键的位置[^1]。 #### 插入和删除性能 由于 `map` 基于红黑树,插入和删除操作的时间复杂度均为 O(log N),其中 N 表示当前容器中元素的数量。而对于 `unordered_map` 来说,理想情况下插入和删除操作的时间复杂度为常量时间 O(1),但在最坏的情况下(当发生大量哈希冲突时),可能会退化到线性时间 O(N)[^3]。 #### 查找效率 同样地,在 `map` 中执行查找操作也需要花费 O(log N) 时间;而在 `unordered_map` 中,如果哈希分布均匀,则平均查找时间为 O(1),但如果存在严重的哈希碰撞则可能达到 O(N)。 #### 内存占用情况 通常来说,因为需要维护额外的信息用于保持节点之间的链接关系以及支持快速随机访问特性等原因,使得 `unordered_map` 在某些特定条件下可能会比相同大小下的 `map` 占用更多内存空间[^3]。 #### 遍历顺序 遍历时,`map` 提供了一个已排序版本的结果集给迭代器使用,这正是它的一个重要特点之一——能够轻松获取按键值自然排序后的数据集合。然而对于 `unordered_map` ,我们无法预测或者依赖任何特定次序来进行枚举处理。 ```cpp #include <iostream> #include <map> #include <unordered_map> void demonstrateMapAndUnorderedMap() { std::map<int, std::string> ordered; std::unordered_map<int, std::string> unordered; ordered[3] = "Three"; ordered[1] = "One"; ordered[2] = "Two"; unordered[3] = "Three"; unordered[1] = "One"; unordered[2] = "Two"; // 输出有序映射的内容 for (auto& pair : ordered) { std::cout << pair.first << ": " << pair.second << "\n"; } // 输出无序映射的内容 for (auto& pair : unordered) { std::cout << pair.first << ": " << pair.second << "\n"; } } ``` 上述代码展示了如何分别向 `std::map` 和 `std::unordered_map` 添加相同的三个键值对并打印它们。可以看到前者总是以从小到大方式展示出来,而后者的输出顺序则是不确定的。 ### 使用场景建议 - 当应用程序非常关注查询速度并且不需要考虑键之间相对位置的时候可以选择 `unordered_map`. - 如果程序逻辑里涉及到频繁利用已经排好序这一性质来做进一步计算的话那么就应该优先选用 `map`.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值