map:映射,STL容器。
1,作用:
为了解决映射问题。
eg.
arry[0] = 25 就是将0映射到25
db[0] = 3.24 就是将0映射到3.14
但是数组无论怎么定义都是将int映射到其他类型。
map可以将任何类型的(包括STL容器)映射到任何基本类型(包括STL容器)。
2,定义
map<typename1, typename2> mp;
map需要定义前映射类型(键key)和映射后类型(值value),所以需要在<>内填写两个类型。
⚠️:如果是字符串到整数的映射,必须使用string而不能使用char数组;(因为char数组作为数组,是不能被作为键值的)
map<string, int> mp;
map的键和值也可以是STL容器,例如可以将一个set容器映射到一个字符串
eg.
map<set<int>, string> mp;
3,map容器内元素的访问
1)通过下表访问
eg.
对于一个定义为map<char,int> mp的map,
可以通过mp[‘c’]的方式来访问它对应的整数,
当建立映射时,就可以直接使用mp[‘c’]=20这样和普通数组一样的方式。
⚠️:map中的键是唯一的,起那面赋的值,将会被后面的赋值所替代。
#include<cstdio>
#include<map>
using namespace std;
int main(int argc, char const *argv[])
{
map<char, int> mp;
mp['c'] = 20;
mp['c'] = 50;
printf("%d\n", mp['c']);
return 0;
}
2)通过迭代器访问
补充知识:
【
容器是数据结构的泛指,迭代器是指针的泛指。
C++迭代器是一种检查容器内元素并遍历元素的数据类型。
迭代器的作用就相当于去除物品的工具的抽象。
c++迭代器interator就是一个指向某STL对象的指针。通过该指针可以简单方便地遍历所有元素。
】
map迭代器的定义与其他STL容器迭代器定义的方式相同:
map<typename1, typename2>::iterator it;
typename1和typename2就是定义map时填写的类型,这样就得到了迭代器it。
map迭代器的使用方式和其他的STL容器的迭代器不同,因为map每一对迭代器映射都有两个typename,这决定了必须通过一个int来同时访问键和值。
map可以使用it->first来访问键,使用it->second来访问值。
//由于map内部是由红黑树实现的(set也是),在建立映射的过程中会自动实现从小到大的排序功能
#include<cstdio>
#include<map>
using namespace std;
int main(int argc, char const *argv[])
{
map<char, int> mp;
mp['g'] = 22;
mp['a'] = 38;
mp['z'] = 58;
for (map<char, int>::iterator it = mp.begin(); it != mp.end() ; ++it)
{
printf("%c %d\n", it->first, it->second);
}
return 0;
}
3,map常用函数实例解析
1)find()
find(key)返回键为key的映射的迭代器,时间复杂度为O(logN),N为map中映射的个数。
#include<cstdio>
#include<map>
using namespace std;
int main(int argc, char const *argv[])
{
map<char, int> mp;
mp['a'] = 1;
mp['b'] = 2;
mp['c'] = 3;
map<char, int>::iterator it = mp.find('b');
printf("%c %d\n", it->first, it->second);
return 0;
}
2)erase()
有两种用法:删除单个元素,删除一个区间内的所有元素
a,删除单个元素
mp.erase(it), it为需要删除的元素的迭代器,时间复杂度为O(1)
mp.erase(key),key为要删除的映射的键,时间复杂度为O(logN), N为map内元素的个数
#include<cstdio>
#include<map>
using namespace std;
int main(int argc, char const *argv[])
{
map<char, int> mp;
mp['a'] = 1;
mp['c'] = 3;
mp['b'] = 2;
map<char, int>::iterator it = mp.find('a');
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;
}
#include<cstdio>
#include<map>
using namespace std;
int main(int argc, char const *argv[])
{
map<char, int> mp;
mp['b'] = 2;
mp['a'] = 1;
mp['c'] = 3;
mp.erase('b');
for (map<char, int>::iterator it = mp.begin(); it != mp.end() ; ++it)
{
printf("%c %d\n", it->first, it->second);
}
return 0;
}
b,删除一个区间的所有元素
mp.erase(first,last),其中first为需要删除的区间起始迭代器,而last则是需要删除的区间末尾迭代器的下一个地址,也即为删除左闭区间[first,last),时间复杂度为O(last-first)
#include<cstdio>
#include<map>
using namespace std;
int main(int argc, char const *argv[])
{
map<char, int> mp;
mp['b'] = 2;
mp['c'] = 3;
mp['a'] = 1;
map<char, int>::iterator it = mp.find('b');
mp.erase(it, 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)szie()
作用:用来获得map中的映射个数,时间复杂度为O(1)
#include<cstdio>
#include<map>
using namespace std;
int main(int argc, char const *argv[])
{
map<char, int> mp;
mp['a'] = 1;
mp['b'] = 2;
mp['c'] = 3;
mp.clear();
printf("%d\n", mp.size());
return 0;
}
4)clear()
作用:用来清空map中的所有的元素,复杂度为O(N),其中N为map中的元素个数
4.map的常见用途
1)需要建立字符(或字符串)与 整数之间映射的题目,使用map可以减少代码量;
2)判断大整数或者其他类型数据是够存在的题目,可以把map当bool数组用;
2)字符串与字符串的映射也可能会遇到
⚠️:map的键和值是唯一的,而如果一个键需要对应多个值,就只能用multimap。另外,c++11标准中还增加了undered_map,以散列替代内部的红黑树实现,使其可以用来映射而不按key排序的需求。