C++ map与unordered_map

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可以。

原文地址:https://www.cnblogs.com/Kinghao0319/p/14196574.html