map的排序


1.按key值排序
(第一個值,即<key,value>中的key值)
為了實現快速查找,map內部本身就是按序存儲的(比如紅黑樹)。在我們插入<key, value>鍵值對時,就會按照key的大小順序進行存儲,其中key的類型必須能夠進行 < 運算,且唯一,默認排序是按照從小到大便於記憶,可以聯想到需要支持小於運算。
map的模板定義如下

template < class Key, class T, class Compare = less<Key>,  
           class Allocator = allocator<pair<const Key,T> > > class map;

其中第三、四個均包含默認參數,可以不指定。我們可以通過指定Compare類來指定排序的順序。其中less是stl里面的一個函數對象(即調用操作符的類,其對象常稱為函數對象(function object),它們是行為類似函數的對象,表現出一個函數的特征,就是通過“對象名+(參數列表)”的方式使用一個類,其實質是對operator()操作符的重載)其具體定義如下

template <class T> struct less : binary_function <T,T,bool> {  
  bool operator() (const T& x, const T& y) const  
    {return x<y;}  
};

它是一個帶模板的struct,里面僅僅對()運算符進行了重載。與less相對的有greater,定義如下

template <class T> struct greater : binary_function <T,T,bool> {  
  bool operator() (const T& x, const T& y) const  
    {return x>y;}  
};

因此我們在定義map的時候,可以指定如下
map<string,int,greater >
或者定義自己的比較類comLen如下

struct comLen{
     bool operator(const string &lhs, const string &rhs)
     {return lhs.length()<rhs.length();}
}
map<string,int,comLen> LenLessMap;

2.按value值排序
因為map不能用sort排序,所以先把map里的pair存到vector里,再用sort對vector排序,此時map里的順序沒變,要用vector才行。

    bool cmp(const pair<string, int>& x, const pair<string, int>& y)    
    {    
        return x.second > y.second;    
    }    
         
    void sortMapByValue(map<string, int>& tMap,vector<pair<string, int> >& tVector)    
    {    
        for (map<string, int>::iterator curr = tMap.begin(); curr != tMap.end(); curr++)     
            tVector.push_back(make_pair(curr->first, curr->second));      
         
        sort(tVector.begin(), tVector.end(), cmp);    
    }  

參考博客:
https://www.jianshu.com/p/5b24ac2a6cac


免責聲明!

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



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