首页 > 学院 > 开发设计 > 正文

map/set的应用

2019-11-08 18:38:47
字体:
来源:转载
供稿:网友

map/set的应用

关于map、set的一些基础知识,,在之前的博客中已经大致有了一定的了解,,,,今天在这里,,,我们 来说说这两种结构有什么样的用处吧!!!!!!!!!(当然也会有一些关于此类的面试题)

使用 1、、、、、、、、、、、、、、、、

如果说要是给你一个字符串数组strs[],里面保存的是   一群人喜欢吃的水果种类 !!!!那么问题来了》》怎么样 来统计 一下每种水果喜欢的人数是多少?????在此,,,我为大家提供了 ,,,三种方式来解决这问题;;;;假设得到的字符串数组为strs[]= {"苹果","梨","香蕉","柑橘","桃子","苹果","桃子","桃子","梨","桃子","苹果"};

方法一:~~~~~~

我们可以先定义一个map,,,,然后 ,使用find函数查找,,,,如果找到,,,则人数++;否则 、、、、、将此水果插入到map中下面、、、、
void  Testmap(){	string strs[]= {"苹果","梨","香蕉","柑橘","桃子","苹果","桃子","桃子","梨","桃子","苹果"};	map<string ,int> Countmap;//定义一个用来计数的map	Countnum(Countmap,strs,sizeof(strs)/sizeof(strs[0]));}
void Countnum(map<string,int>& Countmap,string* strs,const size_t& n ){	for(size_t i = 0;i < n ;i++)	{		map<string ,int>::iterator  it = Countmap.find(strs[i]);//从map中查找		if(it == Countmap.end())//如果没有找到		{			Countmap.insert(make_pair(strs[i],1));//插入 ,,,并将人数给1		}		else		{			++(it->second);//找到了之后 就 将人数++		}	}}得到的结果 ::统计之前、、、、、、、、、、、、、、、、、、、、、、、统计之后这样 就可以将 结果统计出来了;;;但是这样的效率就低了点 。。。。。

方法二~~~~~

map有一个插入函数 insert   它的返回值是一个pair 类型  pair<iterator,bool>
pair<iterator,bool> insert (const value_type& val);这个函数简单来说就是 这个意思;;;如果插入成功,,,那么返回的pair   的成员first为指向插入数据的迭代器,,,,,second  返回 true;否则,说明已有此数据 ,,,那么,,返回的pair的first为原数据的迭代器,,,,,second   为false;;;我们可以利用这一点 ,,,,
void Countnum(map<string,int>& Countmap,string* strs,const size_t& n ){	for(size_t i = 0;i < n ;i++)	{		pair<map<string,int>::iterator,bool> ret = Countmap.insert(make_pair(strs[i],1));		if(ret.second ==false)//如果没有插入成功的话		{			ret.first->second++;//人数++		}	}}结果:               正确!!!!!!!!!!!这个方法比起方法1来说就简单的多了  ;;;;

方法三~~~~~~~~~

这个就更简单了 、、、、说到底 ,,,就是利用  map  重载的[]  ,,,,,,, 此函数 我已在之前的博客中 有说明了实现代码:::
void Countnum(map<string,int>& Countmap,string* strs,const size_t& n ){	for(size_t i = 0;i < n ;i++)	{		Countmap[strs[i]]++;	}}

使用2、、、、、、、、、、

衔接上面的使用1,,,,,如果说、、、、要让你 将 里面的水果将  按照喜欢人数少来排序;;;;这个又要怎么来做呢?????方法一············(死的方法)建立一个vector容器 ,,,,将里面的数据存下来然后排序
void  Testmap(){	string strs[]= {"苹果","梨","香蕉","柑橘","桃子","苹果","桃子","桃子","梨","桃子","苹果"};	map<string ,int> Countmap;//定义一个用来计数的map	Countnum(Countmap,strs,sizeof(strs)/sizeof(strs[0]));	vector<map<string,int>::iterator>  v;	Sortmap(v,Countmap);}
struct Cmp//重载的比较函数{	bool Operator()(const map<string,int>::iterator& l					,const map<string,int>::iterator& r )	{		return l->second > r->second;	}};void  Sortmap(vector<map<string,int>::iterator>&  v,map<string,int>& Countmap){	map<string,int>::iterator it =Countmap.begin();	while(it!= Countmap.end())	{		v.push_back(it);//全部保存到vector中		++it;	}	sort(v.begin(),v.end(),Cmp());//排序}显示结果:方法二·······我们可以使用堆来进行这个排序 ;;;;
void Sortmap(vector<map<string,int>::iterator>&  v,map<string,int>& Countmap){		map<string , int>::iterator it = Countmap.begin();	while(it!= Countmap.end())	{		v.push_back(it);//全部保存到vector中		++it;	}	vector<map<string,int>::iterator>::iterator it2 = v.end();	make_heap(v.begin(),it2,Cmp());//建一个堆	while(it2!= v.begin())	{		pop_heap(v.begin(),it2,Cmp());//每次将最小的节点给pop到尾部		--it2;	}	vector<map<string,int>::iterator> ::iterator it1 = v.begin();//打印输出 	while(it1 != v.end())	{		cout<<(*it1)->first<<" ,"<<(*it1)->second<<endl;		it1++;	}}

使用三、、、、、、、、、、、

得到喜欢人数最多的三个水果、???其实这种做法更简单了,,,,我们只需要将这些进行排序之后,然后取其前三个元素的数 
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表