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++; }}使用三、、、、、、、、、、、
得到喜欢人数最多的三个水果、???其实这种做法更简单了,,,,我们只需要将这些进行排序之后,然后取其前三个元素的数
新闻热点
疑难解答