zoukankan      html  css  js  c++  java
  • 使用std::map的值得子值进行排序

      最近做点东西,数据使用map存起来的,略为复杂,做显示的时候需要排个序,使用的是value里面的一个子值,开始想使用map自带的招式,折腾个把小时愣是没搞好,放弃,应该有更好的方法,vector的排序就很好使,代码量小,简单易懂,所以想着能不能将map数据转换成vector来处理,线性表操作起来相比map我想还是要好一些吧,哈哈哈。

      我把map的key和value封装成结构体,这样就可以使用vector存储起来了。

      原来的数据结构:

     1       struct datestruct
     2     {
     3         int age;
     4         bool isboy;
     5         long long birthtm;
     6         string name;
     7         datestruct(int a, bool b,long long bt, string n)
     8         {
     9             age = a;
    10             isboy = b;
    11             birthtm = bt;
    12             name = n;
    13         }
    14     };
    15      map<string , vector<datestruct*>> map_data;     

      要求map_data按照vector<datestruct*>的第一个值得birthtm排序,而且要求vector<datestruct*>里的内容也需要按照birthtm排序,如果使用map提供的通过添加排序类或者使用默认排序类进行排序,代码会比较复杂,而且还不一定能实现的好,所以干脆将map封装成结构体,再装进vector进行排序,简单易懂:

    //构造数据
         string addr1 = "南山";
         string addr2 = "宝安";
    
         datestruct d1(10, false, 123456, "张三");
         datestruct d2(9, false, 923356, "张一");
         datestruct d3(21, false, 325456, "张四");
         datestruct d4(15, false, 623656, "张七");
         datestruct d5(18, false, 523456, "张二");
         datestruct d6(6, false, 823456, "张九");
    
         vector<datestruct*> v1;
         vector<datestruct*> v2;
         v1.push_back(&d1);
         v1.push_back(&d2);
         v1.push_back(&d3);
         v2.push_back(&d4);
         v2.push_back(&d5);
         v2.push_back(&d6);
    
         //对map里的value先进行排序
         sort(v1.begin(), v1.end(), [](datestruct* d1, datestruct* d2){
             return d1->birthtm > d2->birthtm;
         });
         sort(v2.begin(), v2.end(), [](datestruct* d1, datestruct* d2){
             return d1->birthtm > d2->birthtm;
         });
         //构造map数据
         map_data.insert(pair<string, vector<datestruct*>>(addr1, v1));
         map_data.insert(pair<string, vector<datestruct*>>(addr2, v2));
    
         //将map数据封装成结构体
         struct sortstruct
         {
             string address;
             vector<datestruct*> datas;
         };
        //构造新的vector数据结构
         vector<sortstruct*> sort_vec;
    
         for (map<string, vector<datestruct*>>::iterator it = map_data.begin(); it != map_data.end(); it++)
         {
             sortstruct *sst = new sortstruct();
             sst->address = it->first;
             sst->datas = it->second;
             sort_vec.push_back(sst);
         }
         
         //排序
         sort(sort_vec.begin(), sort_vec.end(), [](sortstruct* s1, sortstruct *s2){
             return s1->datas.at(0)->birthtm > s2->datas.at(0)->birthtm;
         });
    
    
         //输出
         for (sortstruct *v: sort_vec)
         { 
             cout << v->address.c_str() << endl;
             for (datestruct* vd:v->datas)
             {
                 cout << vd->birthtm << endl;
             }
         }

    输出结果:

  • 相关阅读:
    【分享】马化腾:产品设计与用户体验
    《JavaScript高级程序设计》读书笔记(八):Function类及闭包
    《JavaScript高级程序设计》阅读笔记(七):ECMAScript中的语句
    SET XACT_ABORT各种用法及显示结果
    发布一款域名监控小工具——Domain(IP)Watcher
    【转】C#正则表达式整理备忘
    《JavaScript高级程序设计》阅读笔记(一):ECMAScript基础
    Entity Framework多对多关系实践(manytomany)
    jQuery插件原来如此简单——jQuery插件的机制及实战
    《JavaScript高级程序设计》阅读笔记(二):ECMAScript中的原始类型
  • 原文地址:https://www.cnblogs.com/leisc/p/6562414.html
Copyright © 2011-2022 走看看