6.4 map详解
map翻译为映射,也是常用的STL容器。map可以将任何基本类型(包括STL容器)映射到任何基本类型(包括STL容器),也就可以建立string类型到int类型的映射。
如果要使用map,需要添加头文件和命名空间。
#include<map>
using namespace std ;
1.map的定义
单独定义一个map
map<typename1 , typename2> mp ;
而如果将字符串映射到整型,只能是string而不能是char数组
map< string , int > mp ;
这是因为char数组作为数组,是不能作为键值的。
map的键和值也可以是STL容器。
map< set<int> ,string > mp ;
2. map容器的访问
map一般有两种访问方式:通过下标访问或通过迭代器访问。
(1)通过下标访问
和访问普通数组一样,对于一个定义为map<char, int> mp 的映射来说,就可以直接使用mp[‘c’]的方式来访问它对应的整数。map中的键是唯一的。
(2)通过迭代器访问
map迭代器的定义和其他STL容器迭代器定义相同:
map< typename1 , typename2 >::iterator it ;
map迭代器的使用方式和其他STL容器的迭代器不用,因为map的每一对映射都有两个typename,这决定了必须通过一个it来同时访问键和值。事实上,map可以使用it->first来访问键,it->second来访问值
for( auto it = mp.begin() ; it != mp.end() ; it++ ){
cout << it->first << " " << it->second << endl ;
}
接下来似乎发现了一个很有意思的现象:map会以键从小到大自动排序,这是由于map内部是使用红黑树实现的(set也是)
3.map常用函数实例解析
(1)find()
find(key)返回键为key的映射的迭代器,没找到时返回mp.end(),时间复杂度为O(logN)。
(2)erase()
erase()有两种用法:删除单个元素、删除一个区间内的所有元素。
- 删除单个元素。
-
删除单个元素
删除单个元素有两种方法:-
mp.erase(it),it为迭代器,复杂度为O(1)。
auto it = mp.find('b'); mp.erase(it) ;
-
mp.erase(key),key为欲删除的映射的键,复杂度为O(logN)。
mp.erase('c') ;
-
- 删除一个区间内的元素
mp.erase(first , last),即[first , last)。
(3)size()
size()用来获得map中映射的个数,复杂度为O(1)。
(4)clear()
清空map中的所有元素,复杂度为O(N)
延伸
map的键和值是唯一的,而如果一个键需要对应多个值,就只能用multimap。另外,在C++11标准中还增加了unordered_map,以散列代替map内部的红黑树实现,使其可以用来处理映射而不按key排序的需求,速度比map快得多。