C++ STL map的基本用法
- 本文不涉及到mutlimap多重映射
- 本文只涉及map的常见用法
关于map
map是一个巨大的桶,下标范围取决于关键字类型的范围
map是一种
关联容器
,map由两个部分组成,分别是键(Key)
和值(Value)
。
map的特点:每个键只能映射成一个值。
所谓映射,是指通过一个值(关键字)通过某种方式得到另一个值。这也是Map最大的特色
为什么使用Map
在某些题中,数据范围非常大, n n n有时会开到 1 0 8 10^8 108,而开数组或vector会占用很多额外的空间,有没有一种数据结构可以省下多余的空间而避免MLE,并且缩短遍历数组所用的时间避免TLE呢?
在这种情况下,$map$是一种很好的容器,可以解决这种问题。
map的原理
想象一下,在网上查找东西的时候,如果想要查有关A的相关资料,如果内容合理,它一定会给出你相关的资料(除了广告),它的原理就是在已知的数据库中找到关键字对应的内容。
map的使用
提示:元素查找之前为重点内容,之后了解即可
以下默认使用using namespace std;
m a p 的定义 map的定义 map的定义
#include <map> //头文件:map
map <Type1,Type2> Name;
//Type1和Type2是数据类型,可以是int/double/char甚至string和结构体
// 都可以作为他的关键字(Type1)和值(Type2)
例子:
map <int,int> MyMap;
m a p 的存值 map的存值 map的存值
方法1:直接使用下标
MyMap[Key]=Val;
例子:
MyMap[5] = 3;
map的存值也很简单,就像数组一样,在中括号内放下标,等号右边是值。
方法2:使用 i n s e r t insert insert函数
MyMap.insert({Key, Val});
例子:
MyMap.insert({5, 3});
与上文的 MyMap[5] = 3 等价
其中, k e y key key就是我们上文提到的关键字, V a l Val Val是上文我们提到的值
m a p 值的调用 map值的调用 map值的调用
直接用下标即可
cout << MyMap[Key];
Map容器名[关键字]
就可以调取值了。
元素查找 元素查找 元素查找
其实Map支持迭代器
迭代器用法:
for(auto it=MyMap.begin();it!=MyMap.end();++it)
{
cout << it->first << " " << it->second << endl;
}
这样就可以输出Map中使用过的关键字和值一一对应了。
元素查找:
auto it=MyMap.find(Val);
//auto关键字只能在 C++11 中使用,可在编译命令后加上-std=c++11
或
map<Type1,Type2> :: iterator it; //map的正向
如果没有找到,it的值就会是这个map容器的尾指针。
元素删除 元素删除 元素删除
MyMap.erase(MyMap_Del_Start,MyMap_Del_End);
其中,My_Map_Del_Start
是删除的左边界(头指针),My_Map_Del_End
是删除的右边界(尾指针)
map的练习
若想进一步了解map的具体实例,请移步至luogu P3613【深基15.例2】寄包柜(本人认为这是一个很好的map例题,虽然不难,但是可以很好的理解map的用法)。
示例代码(cpp):
#include<bits/stdc++.h>
using namespace std;
int n,m,x,y,k,op;
map <pair<int,int>,int> FirMap;
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>op;
if(op&1){ //op是奇数,二进制的最后一位
cin>>x>>y>>k;
pair<int,int> key=make_pair(x,y);
FirMap[key]=k;
}
else{
cin>>x>>y;
pair<int,int> key=make_pair(x,y);
cout<<FirMap[key]<<endl;
}
}
return 0;
}
代码中涉及到的pair
,请读者自行查阅资料,这里不做讲解。
希望这篇文章对你有帮助。