C++按map的value進行排序
阿新 • • 發佈:2019-01-05
C++中,map是按key值大小排序儲存。有時候,我們需要對map的value進行排序,根據value的大小順序獲得key的序列。比較簡單的方法就是,重新定義一個新的map,新map的key和value正好是原來map的value和key,這樣新的map就按照原來map的value值進行排序。不過這種方法,要是原來的map的value值沒有重複的話,是正確的,因為map的key值是無重複的。比較正確的做法是將map轉成vector,對利用vector排序。關於原理上的說明,部落格(http://blog.csdn.net/acidgl8757/article/details/17416439)解釋的很清楚。在此,整理了一個直接能用的,方便日後使用。
具體程式碼如下:
#include "stdafx.h" #include <iostream> #include <iomanip> #include <vector> #include <map> #include <string> #include <algorithm> using namespace std; typedef pair<string, double> PAIR; struct CmpByValue { bool operator()(const PAIR& lhs, const PAIR& rhs) { return lhs.second < rhs.second; } }; int _tmain(int argc, _TCHAR* argv[]) { //原來的map map<string, int> name_score_map; name_score_map["LiMin"] = 90; name_score_map["ZiLinMi"] = 79; name_score_map["BoB"] = 92; name_score_map.insert(make_pair("Bing",99)); name_score_map.insert(make_pair("Albert",86)); //把map中元素轉存到vector中 vector<PAIR> name_score_vec(name_score_map.begin(), name_score_map.end()); //對vector排序 sort(name_score_vec.begin(), name_score_vec.end(), CmpByValue()); //排序前 map<string, int>::iterator iter_map; cout << "排序前:" << endl; for(iter_map = name_score_map.begin(); iter_map != name_score_map.end(); iter_map++) cout << left << setw(10) << iter_map->first << iter_map->second << endl; cout << "排序後:" << endl; for (int i = 0; i != name_score_vec.size(); ++i) { //可在此對按value排完序之後進行操作 cout << left << setw(10) << name_score_vec[i].first << name_score_vec[i].second << endl; } return 0; }
結果如圖: