# 概述

mapunordered_map 都是 STL 中的映射容器,但底层实现方式不同,对应的复杂度也不同。

map 基于红黑树实现,在插入过程中会将插入项按键进行排序,所以其支持双向迭代器。使用时需要头文件 <map> .

unordered_map 基于哈希表实现,仅支持前向迭代器。但 unordered_map 支持 begin() / cbegin() / end() / cend() , 因此可以对其中的元素进行遍历,但遍历是哈希序 (乱序) 的。使用 unordered_map 需要头文件 <unordered_map><hash> . 此外,还需注意 unordered_mapC++ 11 支持的新特性,在先前的 C++ 版本中并不支持。

cbegin()cend() 是常量迭代器,与 begin()end() 指向的内容相同,但不能修改容器中元素的值。使代码更安全。

# 存储形式

mapunordered_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 当前的负载因子,即元素数量与桶的数量的比值