map
翻译为映射,可以实现将任何基本类型(包括 STL 容器)映射到任何基本类型(包括 STL 容器),在使用时需加上 map 头文件,即 #include <map>
,并在头文件下加上 “using namespace std;
”。
1. map 的定义
单独定义一个 map:
map<typename1, typename2> mp ;
typename1
:键的类型
typename2
:值的类型
将键的类型映射到值的类型
例:将字符串映射到整型
map<string, int> mp ;
2. map 容器内元素的访问
map 一般有两种访问方式:通过下标访问和通过迭代器访问。
(1) 通过下标访问
例:typename<char, int> mp ;
则 mp[‘c’] = 20 ; 完成将字符 c 到整型数字 20 的映射
(2) 通过迭代器访问
map<typename1, typename2>::iterator it ;
map 使用 it->first 来访问键, 使用 it->second 来访问值
#include <cstdio>
#include <map>
using namespace std ;
int main () {
map<char, int> mp ;
mp['N'] = 1 ;
mp['B'] = 2 ;
mp['A'] = 3 ;
for (map<char, int>::iterator it = mp.begin(); it != mp.end(); it++) {
printf ("%c %d\n", it -> first, it -> second) ;
}
return 0 ;
}
输出如下:
A 3
B 2
N 1
可以观察到输出结果是按照 A<B<N 的顺序排序之后输出,这是由于 map 内部是使用红黑树实现的 (set 也是), 在建立映射的过程中会自动实现从小到大的排序功能。
3. map 常用函数实现实例
(1) find()
//find(key):返回键为 key 的映射的迭代器
#include <cstdio>
#include <map>
using namespace std ;
int main () {
map<char, int> mp ;
mp['N'] = 1 ;
mp['B'] = 2 ;
mp['A'] = 3 ;
map<char, int>::iterator it = mp.find('B') ;
printf ("%c %d", it -> first, it -> second) ;
return 0 ;
}
(2) erase()
i) 删除单个元素
- mp.erase(it), it为需要删除的元素的迭代器
#include <cstdio>
#include <map>
using namespace std ;
int main () {
map<char, int> mp ;
mp['N'] = 1 ;
mp['B'] = 2 ;
mp['A'] = 3 ;
map<char, int>::iterator it = mp.find('N') ;
mp.erase(it) ;
for (map<char, int>::iterator it = mp.begin(); it != mp.end(); it++) {
printf ("%c %d\n", it -> first, it -> second) ;
}
return 0 ;
}
- mp.erase(key) , key 为欲删除的映射的键
#include <cstdio>
#include <map>
using namespace std ;
int main () {
map<char, int> mp ;
mp['N'] = 1 ;
mp['B'] = 2 ;
mp['A'] = 3 ;
mp.erase('N') ;
for (map<char, int>::iterator it = mp.begin(); it != mp.end(); it++) {
printf ("%c %d\n", it -> first, it -> second) ;
}
return 0 ;
}
ii) 删除一个区间内的所有元素
mp.erase(first, last), 删除 [first, last) 区间内元素
#include <cstdio>
#include <map>
using namespace std ;
int main () {
map<char, int> mp ;
mp['N'] = 1 ;
mp['B'] = 2 ;
mp['A'] = 3 ;
mp.erase(mp.find('B'), mp.end()) ;
for (map<char, int>::iterator it = mp.begin(); it != mp.end(); it++) {
printf ("%c %d\n", it -> first, it -> second) ;
}
return 0 ;
}
(3) size()
//size():用来获得 map 中映射的对数
#include <cstdio>
#include <map>
using namespace std ;
int main () {
map<char, int> mp ;
mp['N'] = 1 ;
mp['B'] = 2 ;
mp['A'] = 3 ;
printf ("%d", mp.size()) ;
return 0 ;
}
(4) clear()
//clear():用来清空 map 中所有元素
#include <cstdio>
#include <map>
using namespace std ;
int main () {
map<char, int> mp ;
mp['N'] = 1 ;
mp['B'] = 2 ;
mp['A'] = 3 ;
mp.clear() ;
printf ("%d", mp.size()) ;
return 0 ;
}