2020年2月17日 map
map相当于一种特殊的数组。普通的数组是从数到数或字符的映射,即int或char类型的数组,下标都是数字。而map则是任意数据类型间的映射。借助map能完成更多类型的插入、查找等功能。map的另一个优点是范围大,比如大小为1e9的数组在c++中是无法定义的,但定义为map后可以查找1e9范围的数字,所以map可以当做大范围数组使用。
还简单介绍了pair的定义,可以把pair理解为二元结构体的替代品,其中有first和second两个元素。
林大OJ 1687 保龄球-map
#include <bits/stdc++.h>
using namespace std;
map<int,int>vis;//这里相当于开了一个大小为1e9的数组,正常数组是开不到这么大的
int main()
{
ios::sync_with_stdio(false);
int n,x,y,k;
cin>>n;
for(int i=1;i<=n;i++){
cin>>x;
vis[x]=i;
}
cin>>k;
while(k--){
cin>>y;
printf("%d\n",vis[y]);//如果vis[y]未出现过,那么它的值为0。
}
return 0;
}
林大OJ 1678 查字典
也是map的基本题型,主要在于理解,该题是从字符串到数字的映射。
#include <bits/stdc++.h>
using namespace std;
map<string,int>a;
int main()
{
ios::sync_with_stdio(false);
int m,n,x;
string s;
a.clear();
cin>>n;
while(n--){
cin>>s;
cin>>x;
a[s]=x;
}
cin>>m;
while(m--){
cin>>s;
cout<<a[s]<<endl;
}
return 0;
}
林大OJ 1686 眼红的Medusa
这里map的用途是作为一个2e9大小的数组记录某一编号是否出现。
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
map<int,int>vis;
int a[N],b[N],ans[N],cnt;
int main()
{
ios::sync_with_stdio(false);
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=m;i++){
cin>>b[i];
vis[b[i]]++;
}
for(int i=1;i<=n;i++)
if(vis[a[i]])
ans[++cnt]=a[i];
for(int i=1;i<=cnt;i++)
printf("%d ",ans[i]);
return 0;
}