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;    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM