• map按键排序


    map按键排序

    1 //按键排序:
    2 map<string,int> mp;//从小到大排序
    3 map<string,int,less<string> > mps;//从小到大排序
    4 map<string,int,greater<string> >maps;//从大到小排序
    5 map<string,int,cmp> mapc;//自定义排序,cmp为结构体

    注:

     1     //map内部本身就是按序存储的(比如红黑树)
     2     //插入<key, value>键值对时,就会按照key的大小顺序进行存储,其中key的类型必须能够进行 < 运算,且唯一
     3 
     4  //   map的模板定义如下
     5     template < class Key, class T, class Compare = less<Key>,class Allocator = allocator<pair<const Key,T> > > class map;
     6 
     7  //第三、四个均包含默认参数,可以不指定。我们可以通过指定Compare类来指定排序的顺序。
     8  //其中less<Key>是stl里面的一个函数对象(即调用操作符的类,其对象常称为函数对象(function object)
     9  //它们是行为类似函数的对象,表现出一个函数的特征,就是通过“对象名+(参数列表)”的方式使用一个类,
    10 
    11    //其实质是对operator()操作符的重载
    12 
    13   //是一个带模板的struct,对()运算符进行了重载。
    14 
    15     //从小到大 map<string,int,less<string> >
    16     template <class T> struct less : binary_function <T,T,bool>{
    17         bool operator() (const T& x, const T& y) const{
    18             return x<y;
    19         }
    20     };
    21 
    22    //从大到小 map<string,int,greater<string> >
    23     template <class T> struct greater : binary_function <T,T,bool>{
    24         bool operator() (const T& x, const T& y) const{
    25             return x>y;
    26         }
    27     };
    28 
    29     //3自定义排序:
    30     struct cmp{
    31         bool operator()(const string& x,const string &y ){
    32             return x.length()>y.length();
    33         }
    34     }
    35     map<string,int,cmp> mp;

    测试代码:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 struct cmp{
     4     bool operator()(const string& x,const string &y ){
     5         return x.length()>y.length();
     6     }
     7 };
     8 void display(map<string,int>& mp)
     9 {
    10     map<string,int>::iterator iter=mp.begin();
    11     while(iter!=mp.end())
    12     {
    13         cout<<iter->first<<" "<<iter->second<<endl;
    14         iter++;
    15     }
    16     cout<<endl;
    17 }
    18 void display(map<string,int,greater<string> >& mp)
    19 {
    20     map<string,int,greater<string> >::iterator iter=mp.begin();
    21     while(iter!=mp.end())
    22     {
    23         cout<<iter->first<<" "<<iter->second<<endl;
    24         iter++;
    25     }
    26     cout<<endl;
    27 }
    28 void display(  map<string,int,cmp> & mp)
    29 {
    30      map<string,int,cmp> ::iterator iter=mp.begin();
    31     while(iter!=mp.end())
    32     {
    33         cout<<iter->first<<" "<<iter->second<<endl;
    34         iter++;
    35     }
    36     cout<<endl;
    37 }
    38 
    39 int main()
    40 {
    41     //按键排序:
    42     //从小到大排序
    43     map<string,int> mp;
    44 
    45     mp.insert({"abc",1});//使用{}
    46     mp.insert({"zbc",4});//使用{}
    47     mp.insert({"bbc",3});//使用{}
    48     mp.insert({"kbc",2});//使用{}
    49     mp.insert({"fbc",6});//使用{}
    50     mp.insert({"ebc",0});//使用{}
    51 
    52     //从小到大排序,mp默认从小到大,不能初始化从大到小的key排序
    53     map<string,int,less<string> > mps(mp);
    54     display(mp);
    55     display(mps);
    56 
    57     //从大到小排序
    58     map<string,int,greater<string> > maps;
    59     maps.insert({"ad",1});
    60     maps.insert({"d",2});
    61     maps.insert({"f",4});
    62     maps.insert({"ss",7});
    63     maps.insert({"z",8});
    64     display(maps);
    65 
    66     //自定义排序,cmp为结构体  按字符串的长度排序
    67     map<string,int,cmp>  mapc;
    68     mapc.insert({"ad",1});
    69     mapc.insert({"dssss",2});
    70     mapc.insert({"fss",4});
    71     mapc.insert({"ss",7});
    72     mapc.insert({"z",8});
    73     display(mapc);
    74     return 0;
    75 }

    运行结果:

     1 abc 1
     2 bbc 3
     3 ebc 0
     4 fbc 6
     5 kbc 2
     6 zbc 4
     7 
     8 abc 1
     9 bbc 3
    10 ebc 0
    11 fbc 6
    12 kbc 2
    13 zbc 4
    14 
    15 z 8
    16 ss 7
    17 f 4
    18 d 2
    19 ad 1
    20 
    21 dssss 2
    22 fss 4
    23 ad 1
    24 z 8
  • 相关阅读:
    [转]在C#中使用异步Socket编程实现TCP网络服务的C/S的通讯构架(一)
    Ubuntu操作系统安装使用教程 转载
    ArcInfo和MapInfo的比较 转 http://www.cnblogs.com/njnudt/archive/2007/07/18/821974.html
    jxl导出excel
    flex 图表
    telnet/ssh基本知识
    flex 判断数据类型的几种方法
    友人记
    16进制颜色表
    Ajax不能提交excel
  • 原文地址:https://www.cnblogs.com/NirobertEinteson/p/11967672.html
Copyright © 2020-2023  润新知