zoukankan      html  css  js  c++  java
  • 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;    
  • 相关阅读:
    Office办公软件停止工作解决方案
    Jquery blockUI用法
    IE浏览器对js代码的高要求
    IIS中应用程序切换物理路径遇到的问题
    using关键字
    剑指offer-面试题23-链表中环的入口节点-双指针
    剑指offer-面试题22-链表中倒数第k个节点-双指针
    剑指offer-面试题21-调整数组顺序使奇数位于偶数前面-双指针
    剑指offer-面试题20-表示数值的字符串-字符串
    剑指offer-面试题19-正则表达式匹配-字符串
  • 原文地址:https://www.cnblogs.com/hushaojun/p/6012206.html
Copyright © 2011-2022 走看看