map学习小结

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数组作为数组,不能被作为键值的

扫描二维码关注公众号,回复: 2733552 查看本文章

同时,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

猜你喜欢

转载自blog.csdn.net/qq_42232118/article/details/81609816