zoukankan      html  css  js  c++  java
  • c++ map按key或value的值分别进行排序

    一、对key值进行特定的排序

    map容器里面有两个值一个key一个是value,map<key,value>,其实map里面还有第三个参数,是一个类,用来对map的key进行排序的类,定义如下

    template<class _Kty,
        class _Ty,
        class _Pr = less<_Kty>,
        class _Alloc = allocator<pair<const _Kty, _Ty> > >
        class map

    less<_Kty>的代码

    struct less
            : public binary_function<_Ty, _Ty, bool>
        {    // functor for operator<
        bool operator()(const _Ty& _Left, const _Ty& _Right) const
            {    // apply operator< to operands
            return (_Left < _Right);
            }
        };

    那么根据上面的代码我们也可以写出一个greater类来让key按照降序排列

    #include <iostream>
    #include <string>
    #include <map>
    using namespace std;
    
    typedef pair<string, int> PAIR;
    
    struct greater
    {   
        bool operator()(const string& _Left, const string& _Right) const
        {  
            return (_Left > _Right);
        }
    };
    
    int main()
    {
        map<string, int,greater> ma;
        ma["Alice"] = 86;
        ma["Bob"] = 78;
        ma["Zip"] = 92;
        ma["Stdevn"] = 88;
        for (map<string, int>::iterator ite = ma.begin(); ite != ma.end(); ++ite)
        {
            cout << ite->first << " " << ite->second << endl;
        }
        getchar();
    }

    默认的排序和用greater进行的排序分别如下

    以上就对key值进行了你想要的排序方式。

    二、对value的值进行排序

    因为map的模板里面没有对value的值进行排序的参数,所以只能借助sort函数,然而sort函数只能对vector,list,queue等排序,无法对map排序,那么就需要把map的值放入vector中在对vector进行排序,在对vector进行输出,从而间接实现了对map的排序。sort也有第三个参数,跟上面那个map类似,所以可以写一个类或者函数来将其排序。

    #include <iostream>
    #include <string>
    #include <map>
    #include <algorithm>
    #include <vector>
    using namespace std;
    
    typedef pair<string, int> PAIR;
    
    bool cmp_val(const PAIR &left,const PAIR &right)
    {
        return left.second < right.second;
    }
    
    int main()
    {
        map<string, int> ma;
        ma["Alice"] = 86;
        ma["Bob"] = 78;
        ma["Zip"] = 92;
        ma["Stdevn"] = 88;
        vector<PAIR> vec(ma.begin(),ma.end());
        sort(vec.begin(),vec.end(),cmp_val);
        for (vector<PAIR>::iterator ite = vec.begin(); ite != vec.end(); ++ite)
        {
            cout << ite->first << " " << ite->second << endl;
        }
        getchar();
    }

    结果如下

    这样就通过cmp_val函数对vector进行了排序,然后在将其输出即可。

    如果感觉写函数过于繁琐也可以直接在sort里面用lambda表达式,代码如下

    #include <iostream>
    #include <string>
    #include <map>
    #include <algorithm>
    #include <vector>
    using namespace std;
    
    typedef pair<string, int> PAIR;
    
    int main()
    {
        map<string, int> ma;
        ma["Alice"] = 86;
        ma["Bob"] = 78;
        ma["Zip"] = 92;
        ma["Stdevn"] = 88;
        vector<PAIR> vec(ma.begin(),ma.end());
        sort(vec.begin(), vec.end(),[](const PAIR &left, const PAIR &right)
        {
            return left.second < right.second;
        });
        for (vector<PAIR>::iterator ite = vec.begin(); ite != vec.end(); ++ite)
        {
            cout << ite->first << " " << ite->second << endl;
        }
        getchar();
    }
  • 相关阅读:
    equals方法
    StringBudilde
    日期
    system
    File类
    calender
    stringbuilder tostring
    File的三种构造方法
    Java入门——day52
    Java入门——day53
  • 原文地址:https://www.cnblogs.com/skblog/p/5353154.html
Copyright © 2011-2022 走看看