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++; }}使用三、、、、、、、、、、、
得到喜歡人數最多的三個水果、???其實這種做法更簡單了,,,,我們只需要將這些進行排序之后,然后取其前三個元素的數
新聞熱點
疑難解答