1. 定义
map: map内部实现了一个红黑树(红黑树是非严格平衡二叉搜索树,而AVL是严格平衡二叉搜索树),红黑树具有自动排序的功能,因此map内部的所有元素都是有序的,红黑树的每一个节点都代表着map的一个元素。因此,对于map进行的查找,删除,添加等一系列的操作都相当于是对红黑树进行的操作。
unordered_map: unordered_map内部实现了一个哈希表(也叫散列表,通过把关键码值映射到Hash表中一个位置来访问记录,查找的时间复杂度可达到O(1),其在海量数据处理中有着广泛应用)。因此,其元素的排列顺序是无序的。
2. 两者优缺点:
map是有序的(可自定义排序),用于需要有序的场景;
unordered_map无序,使用普通查找场景。
3. unordered_map方法
=================迭代器=========================
begin 返回指向容器起始位置的迭代器(iterator)
end 返回指向容器末尾位置的迭代器
cbegin 返回指向容器起始位置的常迭代器(const_iterator)
cend 返回指向容器末尾位置的常迭代器
=================Capacity================
size 返回有效元素个数
max_size 返回 unordered_map 支持的最大元素个数
empty 判断是否为空
=================元素访问=================
operator[] 访问元素
at 访问元素
=================元素修改=================
insert 插入元素
erase 删除元素
swap 交换内容
clear 清空内容
emplace 构造及插入一个元素
emplace_hint 按提示构造及插入一个元素
================操作=========================
find 通过给定主键查找元素,没找到:返回unordered_map::end
count 返回匹配给定主键的元素的个数
equal_range 返回值匹配给定搜索值的元素组成的范围
================Buckets======================
bucket_count 返回槽(Bucket)数
max_bucket_count 返回最大槽数
bucket_size 返回槽大小
bucket 返回元素所在槽的序号
load_factor 返回载入因子,即一个元素槽(Bucket)的最大元素数
max_load_factor 返回或设置最大载入因子
rehash 设置槽数
reserve 请求改变容器容量
4. map常用方法
插入
//直接下标插入 enumMap[1] = "One"; enumMap[2] = "Two"; //或者 enumMap.insert(map<int, CString> :: value_type(2, "Two"))
//查看是否包含key
enumMap.count(key)== 0
查找
CString tmp = enumMap[2];
遍历
map<pair<int,int>,int>::iterator it=mymap.begin(); while(it!=mymap.end()){ cout<<it->second<<endl; it++; }
删除
mymap.erase(iter);//根据迭代器删除 mymap.erase(mymap.begin(),mymap.end());//相当于clear mymap.erase(key);//根据key删除
5. 踩坑
unordered_map主键类型不能是vector<int>,pair<int,int>这种;但是map可以。