C++ 对unordered_map 进行变通按值排序

下面代码利用对vector in 中的序列按照数字个数多少进行排序,个数相等的不改变原序列顺序

注意:unorder_map是乱序,不会按照插入元素序列排序,所以第二个程序是之前犯得错误

#include
#include
#include
#include
bool compare_map_index(const pair> &a, const pair> &b) {
	return a.second.first < b.second.first;
}
bool compare_map_times(const pair> &a, const pair> &b) {
	return a.second.second > b.second.second;
}
int main() {
	vector in{ 10000,20000,40000,30000,30000,30000,40000,20000,50000,50000,50000,50000,60000,60000,60000,70000,80000,90000,100000 };
	map> a;   //此处使用pair是解决的小技巧
	for (int i = 0; i < in.size(); ++i) {
		auto ret = a.insert({ in[i],{i,0} });
		if (ret.second) 
			a[in[i]].first = i;
		++a[in[i]].second;
	}
	vector>> b;    
	for (auto temp : a)
		b.push_back(temp);
	for (auto it = b.begin(); it != b.end(); ++it) {
		for (int i = 0; i < it->second.second; ++i) {
			cout << it->first << " ";
		}
		cout << endl;
	}
	sort(b.begin(), b.end(), compare_map_index);//第一次排序打破map的顺序,按照插入顺序先来后到排序
	stable_sort(b.begin(), b.end(), compare_map_times);//第二次在保持原来次序的基础上,按照出现次数排序
	for (auto it = b.begin(); it != b.end();++it) {
		for (int i = 0; i second.second; ++i) {
			cout << it->first << " ";
		}
		cout << endl;
	}
	return 0;
}
#include
#include
#include
#include
using namespace std;
bool compare_map(const pair&a, const pair&b) {
	return a.second > b.second;
}
int main() {
	vector in{ 5,5,5,5,4,5,3,3,3,2,2,7 };
	unordered_map a;  //无序map,不会进行排列
	for (auto temp : in)     //记录序列元素个数
		++a[temp];
	vector> b;     //非常关键,因为unordered_map,map本身不支持sort,将unordered_map,map中的元素pair保存在vector>中就可以支持sort操作
	for (auto &temp : a)
		b.push_back(temp);      //map,unordered_map中的元素都是以pair类存在
	//sort(a.begin(), a.end());//map,unordered_map不支持sort算法
	stable_sort(b.begin(), b.end(), compare_map);   //使用stable_sort,不改变原来的相对顺序,自定义比较大小
	for (auto it = b.begin(); it != b.end(); ++it) {
		for (int i = 0; i < it->second; ++i)
			cout << it->first << " ";
		cout << endl;
	}
	
	return 0;
}

 

你可能感兴趣的:(C++算法)