zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    UVALive 7141 BombX
    CodeForces 722D Generating Sets
    CodeForces 722C Destroying Array
    CodeForces 721D Maxim and Array
    CodeForces 721C Journey
    CodeForces 415D Mashmokh and ACM
    CodeForces 718C Sasha and Array
    CodeForces 635C XOR Equation
    CodeForces 631D Messenger
    田忌赛马问题
  • 原文地址:https://www.cnblogs.com/qinjames/p/10554944.html
Copyright © 2011-2022 走看看