• 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

  • 相关阅读:
    cocos2dx遇到的一些坑
    cocos2dx场景切换的坑
    整合quickx到普通cocos2dx
    Hadoop、spark
    Redis高级特性及应用场景
    wpf相关好资源
    MVVM模式的几个开源框架
    ASP.NET的IIS映射
    NET 开发者必备的工具箱
    C#开源汇总
  • 原文地址:https://www.cnblogs.com/qinjames/p/10554944.html
Copyright © 2020-2023  润新知