37.STL中unordered_map和map的区别和应用场景
37.STL中unordered_map和map的区别和应用场景
1.STL中unordered_map和map的区别
std::unordered_map
和 std::map
都是 C++ 标准库中用于存储键值对的关联容器,它们主要的区别在于内部数据的组织方式,以及因此产生的一些性能特性:
1.内部数据结构:
std::map
:使用了平衡二叉搜索树(通常是红黑树)作为其内部数据结构,所以其元素是根据键自动排序的。std::unordered_map
:使用哈希表作为其内部数据结构,元素的排列顺序则取决于哈希函数,不保证任何特定的顺序。
2.时间复杂度:
std::map
:查找、插入和删除操作的平均时间复杂度为 O(log n)。std::unordered_map
:理想情况下(哈希函数分布良好),查找、插入和删除操作的平均时间复杂度为 O(1)。但在最坏的情况下(例如所有元素都哈希到同一位置),时间复杂度会退化到 O(n)。
3.功能需求:
std::map
:如果需要按键的顺序遍历元素,或者依赖于键值的有序性,那么应选择std::map
。std::unordered_map
:如果不需要元素的有序性,而是优先考虑查找、插入和删除操作的速度,那么应选择std::unordered_map
。
总的来说,std::map
和 std::unordered_map
在使用上的主要区别在于是否需要键的有序性,以及对操作性能的要求。如果需要有序性,选择 std::map
;如果不需要有序性,而是追求高效的查找、插入和删除操作,选择 std::unordered_map
。
2.STL中unordered_map的应用场景
在C++标准库中,std::unordered_map
是一个基于哈希表实现的关联容器,它存储的元素是键值对,键是唯一的。由于其基于哈希的特性,std::unordered_map
在以下几种场景中是非常有用的:
1.快速查找:如果你需要在一堆数据中快速查找某个键对应的值,那么std::unordered_map
是一个很好的选择。例如,你需要查找每个人的电话号码,可以将人名作为键,电话号码作为值存入std::unordered_map
。
2.元素频率计数:如果你需要计算元素出现的频率,std::unordered_map
也非常有用。例如,你需要计算一个文档中每个单词出现的频率,可以将单词作为键,频率作为值存入std::unordered_map
。
3.缓存:std::unordered_map
可以被用作缓存(cache)来存储先前计算的结果,以便快速访问。例如,你可以在执行昂贵的计算或数据库查询后,将结果存储在std::unordered_map
中,后续如果需要相同的计算或查询,可以直接从std::unordered_map
中获取结果,而无需重新进行计算或查询。
4.实现字典:std::unordered_map
可以用来实现一个字典,存储键值对,以便可以通过键快速查找到对应的值。
总的来说,无论何时当你需要一个能够快速插入、删除和查找元素的数据结构,并且不关心元素的顺序,std::unordered_map
都是一个不错的选择。
3.STL中map的应用场景
在C++标准库中,std::map
是一个基于平衡二叉搜索树(通常是红黑树)实现的关联容器,它存储的元素是键值对,并且根据键的值自动进行排序。std::map
在以下几种场景中是非常有用的:
1.有序键值对:如果你需要保存键值对,并且需要根据键的顺序进行迭代,那么 std::map
是一个很好的选择。例如,你可能需要存储每个人的姓名(键)和年龄(值),并需要按照姓名的字母顺序进行排序。
2.查找操作:std::map
提供了高效的查找操作,使你能够快速地找到给定键对应的值。
3.范围查询:std::map
中的元素是有序的,所以你可以执行范围查询,找到所有键在给定范围内的元素。
4.字典或映射:当你需要根据某个键来查找对应的值时,std::map
会非常有用。例如,你可以创建一个地图应用,根据城市的名称(键)查找城市的信息(值)。
总的来说,无论何时当你需要一个能够插入、删除、查找元素,并且保持元素的有序性的数据结构,std::map
都是一个不错的选择。