# 概述
map
和 unordered_map
都是 STL 中的映射容器,但底层实现方式不同,对应的复杂度也不同。
map
基于红黑树实现,在插入过程中会将插入项按键进行排序,所以其支持双向迭代器。使用时需要头文件 <map>
.
unordered_map
基于哈希表实现,仅支持前向迭代器。但 unordered_map
支持 begin()
/ cbegin()
/ end()
/ cend()
, 因此可以对其中的元素进行遍历,但遍历是哈希序 (乱序) 的。使用 unordered_map
需要头文件 <unordered_map>
及 <hash>
. 此外,还需注意 unordered_map
为 C++ 11
支持的新特性,在先前的 C++ 版本中并不支持。
cbegin()
和 cend()
是常量迭代器,与 begin()
和 end()
指向的内容相同,但不能修改容器中元素的值。使代码更安全。
# 存储形式
map
和 unordered_map
内部都采用 pair
进行存储。例如,输出一个映射 map1
的全体键值的代码如下:
for(auto it:map1) cout<<it.first<<" "<<it.second<<endl; |
# 常用函数
函数 | 作用 |
---|---|
at(key) | 返回指定键所映射的值的引用,如果键不存在,则抛出 std::out_of_range 异常 |
[key] | 返回指定键所映射的值的引用,如果键不存在,则创建该键并映射到默认值 |
insert({key, val}) | 插入一个键值对 |
erase(key) | 尝试删除一个键值对,如不存在,则不进行任何操作 |
size() | 返回映射的项数 |
empty() | 返回映射是否为空映射 |
clear() | 清空映射中的所有键值对 |
bucket_count() | 返回映射中桶的数量 (仅对 unordered_map) |
load_factor() | 返回 unordered_map 当前的负载因子,即元素数量与桶的数量的比值 |