最近做点东西,数据使用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; } }
输出结果: