最近做點東西,數據使用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; } }
輸出結果: