把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

STL-map 关联式容器

map就是一个映射,不过我在程序中对它的处理没有很复杂,大多是把它当成一个下标可以为任意类型的数组。
map在程序中挺常用的,也为字符串处理提供了简便,比如 AtCoder-3941(ABC091 B题)

#include<cstdio>
#include<iostream>
#include<map>
#include<vector>
#include<algorithm>
using namespace std;
#define MAXN 105
map<string,int>cnt;
int N,M;
string a[MAXN],b[MAXN];
string temp;
vector<int>ans;
int main()
{
	scanf("%d",&N);
	for(int i=1;i<=N;i++) 
	{
		cin>>a[i];
		cnt[a[i]]++;
	}
	scanf("%d",&M);
	for(int i=1;i<=M;i++) 
	{
		cin>>b[i];
		cnt[b[i]]--;
	}
	map<string,int>::iterator it=cnt.begin();
	int maxx=0;
	while(it!=cnt.end())
	{
		maxx=max(maxx,it->second);	
		it++;
	}
	printf("%d\n",maxx);
}

声明

#include<map>
using namespace std;
map<string,int> m;

这个声明相当于是一个下标为string,值为int的数组,在map里分别是key和value.

迭代器

map<string,int>::iterator it=cnt.begin();

利用迭代器遍历map:

map<string,int>::iterator it=cnt.begin();
	while(it!=cnt.end())
	{
		这里 it->second 就是map里面的值
		it->first 访问的是key,即数组的下标
		it++;
	}

再来一道题 Let the Balloon Rise

#include<cstdio>
#include<iostream>
#include<map>
using namespace std;
int N;
int main()
{
	while(scanf("%d",&N)!=EOF&&N)
	{
		map<string,int> cnt;
		string s,ans;
		for(int i=1;i<=N;i++)
		{
			cin>>s;
			cnt[s]++;
		}
		map<string,int>::iterator it=cnt.begin();
		int maxx=0;
		while(it!=cnt.end())
		{
			if(it->second>maxx)
				maxx=it->second,ans=it->first;
			it++;
		}
		cout<<ans<<endl;
	}
}

  • update 2019.7.15
    count函数用于统计key值在map中出现的次数,map的key不允许重复,因此如果key存在返回1,不存在返回0
mp.count(key)
posted @ 2018-05-07 09:42  Starlight_Glimmer  阅读(5)  评论(0编辑  收藏  举报  来源
浏览器标题切换
浏览器标题切换end