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

原文地址:https://www.cnblogs.com/qinjames/p/10554944.html