使用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;
         }
     }

输出结果:

原文地址:https://www.cnblogs.com/leisc/p/6562414.html