map可以将任何基本类型(包括STL容器)映射到任何基本类型(包括STL容器),当然也可以建立string型到int型的映射
适用场合如:需要判断给定的一些数字在某个文件中是否出现过
头文件#include<map>
using namespace std;
1、map的定义:
单独定义一个map:
map<typename1,typename2>mp;
map和其他STL容器在定义上有点不一样,因为map需要确定映射前(键key)的类型和映射后类型(值value)
如map<string,int>mp;
如果是字符串到整型的映射,必须使用string而不能用char数组:
因为char数组作为数组,不能被作为键值的
同时,map的键和值也可以是STL容器
例如将一个set容器映射到一个字符串:
map<set<int>,string>mp;
2、map容器内的访问
①通过下标访问
与访问数组相同:mp['c']=20
但是要注意的是:map中的键是唯一的
输出的是30
②通过迭代器访问
map迭代器的定义和其他STL容器迭代器定义的方式相同
map<typename1,typename2>::iterator it;
typename1,typename2就是定义map时填写的类型,这样就得到了迭代器it
map迭代器的使用方式和其他STL容器的迭代器不同,因为map的每一对映射都有两个typename
这就决定了必须能通过一个it来同时访问键和值
事实上
map可以使用it->first来访问键
使用it->second来访问值
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
int main()
{
map<char,int>mp;
mp['m']=20;
mp['r']=30;
mp['r']=40;
for(map<char,int>::iterator it=mp.begin();it!=mp.end();it++)
{
printf("%c %d\n",it->first,it->second);
}
return 0;
}
结果:
a 40
m 20
r 30
同时发现map会以键从小到大的顺序自动排序a<m<r
这是因为map内部是使用红黑树实现的(set也是)
建立映射的过程中会自动实现从小到大的排序功能
3、map常用函数
①find()
find(key)返回键为key的映射的迭代器
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
int main()
{
map<char,int>mp;
mp['m']=20;
mp['r']=30;
mp['b']=40;
map<char,int>::iterator it=mp.find('b');
printf("%c %d\n",it -> first,it -> second);
return 0;
}
输出:
b 40
②erase()
两种用法:
a:删除单个元素(两种方法)
mp.erase(it),it为需要删除的元素的迭代器
mp.erase(key)key为欲删除的映射的键
b:产出一个区间内的所有元素
mp.erase(first,last)
其中first为需要删除的区间的起始迭代器,而last则为需要删除的区间的末尾迭代器的下一个地址
也即为删除左闭右开的区间[first,last)
mp.erase(it,mp.end())
③size
用来获得map中映射的次数
④clear
用来清空map的所有元素
4、map的常见用途
①需要建立字符或字符串与整数之间映射的题目,使用map可以减少代码量
②判断大整数或者其他类型数据是否存在的问题,可以把map当做bool数组用
③字符串和字符串的映射也有可能会遇到
延伸:
map的键和值是唯一的,而如果遇到一个键需要对应多个值,就只能用multimap