一、map简介
- map译为映射,可以将任何基本类型(包括STL容器)映射到任何基本类型(包括STL容器)
- map的键和值是唯一的
- 头文件
#include<map>
using namespace std;
- 常见用途
- 需要建立字符(或字符串)与整数之间映射的题目,使用map可以减少代码量
- 判断大整数或者其它类型数据是否存在的题目,可以把map当作bool数组用
- 字符串和字符串的映射
二、map定义
- map需要确定映射前类型(键key)和映射后类型(值value),所以需要在<>内填写两个类型,其中第一个是键类型,第二个是值类型。
- 如果是字符串到整型的映射,必需使用string,不能用char数组。这是因为char数组作为数组,是不能被作为键值的。
- map的键和值也可以是STL容器。
map<string, int> mp;
map<set<int>, string> mp;
三、map容器内元素的访问
- 通过下标访问,map中的键是唯一的
- 通过迭代器访问
- map的每一对映射都有两个typename,故必需通过一个it来同时访问键和值
- map可以用it->first来访问键,用it->second来访问值
- map会以键从小到大的顺序自动排序,这是由于map内部是使用红黑树实现的(set也是), 在建立映射时会自动实现从小到大排序的功能。
#include<stdio.h>
#include<map>
using namespace std;
int main(){
map<char, int> mp;
mp['c'] = 1;
mp['c'] = 9;
printf("%d\n", mp['c']);;
mp['a'] = 8;
mp['d'] = 19;
for(map<char, int>::iterator it = mp.begin(); it != mp.end(); it++)
printf("%c %d\n", it->first, it->second);
return 0;
}
四、map常用函数
- find():find(key)返回键为key的映射的迭代器,时间复杂度为O(logn),n为map中映射的个数
- erase():删除元素
- 删除单个元素
- mp.erase(it),it为要删除元素的迭代器,时间复杂度O(1)
- mp.erase(key),key为要删除的映射的键,时间复杂度为O(logn),n为map中元素的个数
- 删除一个区间内的所有元素
- mp.erase(first, last),其中first为需要删除的区间的起始迭代器,last为需要删除的末尾迭代器的下一个地址,即删除区间[first,last),时间复杂度为O(last-first)
- size():获取map中映射的对数,时间复杂度O(1)
- clear():清空map中的所有元素,复杂度为O(n),n为map中元素的个数。
#include<stdio.h>
#include<map>
using namespace std;
int main(){
map<char,int> mp;
mp['a'] = 10;
mp['s'] = 14;
mp['d'] = 22;
mp['b'] = 1;
mp['e'] = 11;
mp<char, int>::iterator it = mp.find('a');
mp.erase(it);
mp.erase('b');
it = mp.find('e');
mp.erase(it, mp.end());
printf("%d\n", mp.size());
mp.clear();
printf("%d\n, mp.size());
return 0;
}