map和unordered_map都是STL中的容器,它们虽然用法相似,但是背后的原理值得了解,进而在不同场景中有针对性的应用它们。
STL之map
map是C++标准模板库(Standard Template Library)中常用的关联容器(associative container),元素由键值(key value)和映射值(mapped value)组成,通过唯一键值来查找映射值。map中可以通过键值直接得到映射值,例如:
1 |
|
STL之unordered_map
unordered_map也是C++标准模板库中的容器,但是不像map那样常用。unordered_map的基本用法和map几乎完全一样,只是不存在反向迭代器(iterator)。
map与unordered_map的区别
虽然两者在使用上几乎没什么区别,但是在用途上却有不小的差别。原因在于map的内部实现是二叉搜索树(Binary Search Tree),而且是按键值有序的(可以自定义排序方法)。相对的unordered_map的内部实现是哈希表,而且是无序的。它们的内部实现让它们具有了各自的优缺点。
我们知道二叉搜索树各种操作上的性能比较平均也可以接受。不管是查找的O(log N),插入的O(N)还是删除的O(N),虽然都不是最好的情况,但也都是不错的时间复杂度,再加上它是有序的。这使得map容器很常用。
相比于BST的平均,哈希表则更擅长搜索,搜索的摊分时间复杂度达到O(1)。但是它的无序性影响了他的通用性。