1. 程式人生 > >C++按map的value進行排序

C++按map的value進行排序

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

結果如圖: