首页 > 代码库 > C++ STL中Map的按Value排序

C++ STL中Map的按Value排序

那么我们如何实现对pair按value进行比较呢? 第一种:是最原始的方法,写一个比较函数;  第二种:刚才用到了,写一个函数对象。这两种方式实现起来都比较简单。

 

  1. typedef pair<string, int> PAIR;  
  2.   
  3. bool cmp_by_value(const PAIR& lhs, const PAIR& rhs) {  
  4.   return lhs.second < rhs.second;  
  5. }  
  6.   
  7. struct CmpByValue {  
  8.   bool operator()(const PAIR& lhs, const PAIR& rhs) {  
  9.     return lhs.second < rhs.second;  
  10.   }  
  11. };  


接下来,我们看下sort算法,是不是也像map一样,可以让我们自己指定元素间如何进行比较呢?

 

 

  1. template <class RandomAccessIterator>  
  2.   void sort ( RandomAccessIterator first, RandomAccessIterator last );  
  3.   
  4. template <class RandomAccessIterator, class Compare>  
  5.   void sort ( RandomAccessIterator first, RandomAccessIterator last, Compare comp );  

我们看到,令人兴奋的是,sort算法和map一样,也可以让我们指定元素间如何进行比较,即指定Compare。需要注意的是,map是在定义时指定的,所以传参的时候直接传入函数对象的类名,就像指定key和value时指定的类型名一样;sort算法是在调用时指定的,需要传入一个对象,当然这个也简单,类名()就会调用构造函数生成对象。

 

这里也可以传入一个函数指针,就是把上面说的第一种方法的函数名传过来。(应该是存在函数指针到函数对象的转换,或者两者调用形式上是一致的,具体确切原因还不明白,希望知道的朋友给讲下,先谢谢了。)

【参考代码】

  1. int main() {  
  2.   map<string, int> name_score_map;  
  3.   name_score_map["LiMin"] = 90;  
  4.   name_score_map["ZiLinMi"] = 79;  
  5.   name_score_map["BoB"] = 92;  
  6.   name_score_map.insert(make_pair("Bing",99));  
  7.   name_score_map.insert(make_pair("Albert",86));  
  8.  //把map中元素转存到vector中   
  9.   vector<PAIR> name_score_vec(name_score_map.begin(), name_score_map.end());  
  10.   sort(name_score_vec.begin(), name_score_vec.end(), CmpByValue());  
  11.  // sort(name_score_vec.begin(), name_score_vec.end(), cmp_by_value);  
  12.   for (int i = 0; i != name_score_vec.size(); ++i) {  
  13.     cout << name_score_vec[i] << endl;  
  14.   }  
  15.   return 0;  
  16. }  

【运行结果】

技术分享

 


 

  1. #include <iostream>  
  2. #include <cstdlib>    
  3. #include <map>    
  4. #include <vector>    
  5. #include <string>    
  6. #include <algorithm>    
  7.   
  8. using namespace std;  
  9.      
  10. int cmp(const pair<string, int>& x, const pair<string, int>& y)    
  11. {    
  12.     return x.second > y.second;    
  13. }    
  14.      
  15. void sortMapByValue(map<string, int>& tMap,vector<pair<string, int> >& tVector)    
  16. {    
  17.     for (map<string, int>::iterator curr = tMap.begin(); curr != tMap.end(); curr++)     
  18.         tVector.push_back(make_pair(curr->first, curr->second));      
  19.      
  20.     sort(tVector.begin(), tVector.end(), cmp);    
  21. }    
  22. int main()    
  23. {    
  24.     map<string, int> tMap;    
  25.     string word;    
  26.     while (cin >> word)    
  27.     {    
  28.         pair<map<string,int>::iterator,bool> ret = tMap.insert(make_pair(word, 1));    
  29.         if (!ret.second)    
  30.             ++ret.first->second;    
  31.     }     
  32.      
  33.     vector<pair<string,int>> tVector;    
  34.     sortMapByValue(tMap,tVector);    
  35.     for(int i=0;i<tVector.size();i++)    
  36.         cout<<tVector[i].first<<": "<<tVector[i].second<<endl;    
  37.      
  38.     system("pause");    
  39.     return 0;    

C++ STL中Map的按Value排序