原文链接:Sort a map by values in C++
在这篇博客中,我们将讲解如何针对C++的Map的value进行排序。
我们知道 std::map 这个容器默认是根据 键 来排序的,而不是 值。这篇博客讲通过一些方法来对 值 排序。
1:使用 std::vector
#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
typedef std::pair<std::string,int> pair;
int main()
{
	// input map
	std::map<std::string,int> map = {
		{"two", 2}, {"one", 1}, {"four", 4}, {"three", 3}
	};
	// create a empty vector of pairs
	std::vector<pair> vec;
	// copy key-value pairs from the map to the vector
	std::copy(map.begin(),
			map.end(),
			std::back_inserter<std::vector<pair>>(vec));
	// sort the vector by increasing order of its pair's second value
	// if second value are equal, order by the pair's first value
	std::sort(vec.begin(), vec.end(),
			[](const pair& l, const pair& r) {
				if (l.second != r.second)
					return l.second < r.second;
				return l.first < r.first;
			});
	// print the vector
	for (auto const &pair: vec) {
		std::cout << '{' << pair.first << "," << pair.second << '}' << '\n';
	}
	return 0;
}
输出结果:
{one,1}
{two,2}
{three,3}
{four,4}
2:使用std::set
#include <iostream>
#include <map>
#include <set>
// Comparison function for sorting the set by increasing order of its pair's 
// second value. If second value are equal, order by the pair's first value
struct comp
{
	template<typename T>
	bool operator()(const T& l, const T& r) const
	{
		if (l.second != r.second)
			return l.second < r.second;
		return l.first < r.first;
	}
};
int main()
{
	// input map
	std::map<std::string,int> map = {
		{"two", 2}, {"one", 1}, {"four", 4}, {"three", 3}
	};
	// create a empty vector of pairs
	std::set<std::pair<std::string,int>, comp> set(map.begin(), map.end());
	// print the vector
	for (auto const &pair: set) {
	   std::cout << '{' << pair.first << "," << pair.second << '}' << '\n';
	}
	return 0;
}
输出结果:
{one,1}
{two,2}
{three,3}
{four,4}
3:使用std::multimap
#include <iostream>
#include <map>
#include <set>
#include <algorithm>
// Function to convert a std::map<K,V> to std::multimap<V,K>
template<typename K, typename V>
std::multimap<V,K> invertMap(std::map<K,V> const &map)
{
	std::multimap<V,K> multimap;
	for (auto const &pair: map) {
		multimap.insert(std::make_pair(pair.second, pair.first));
	}
	return multimap;
}
int main()
{
	// input map
	std::map<std::string,int> map = {
		{"two", 2}, {"one", 1}, {"four", 4}, {"three", 3}
	};
	// invert the map
	std::multimap<int,std::string> multimap = invertMap(map);
	// print the multimap
	for (auto const &pair: multimap) {
	   std::cout << '{' << pair.second << "," << pair.first << '}' << '\n';
	}
 
	return 0;
}
输出结果:
{one,1}
{two,2}
{three,3}
{four,4}
感谢阅读~Happy Coding~
文章的脚注信息由WordPress的wp-posturl插件自动生成
                
微信扫一扫,打赏作者吧~![[整理][转载]win下网卡抓包发包库Npcap使用](http://www.jyguagua.com/wp-content/themes/begin/timthumb.php?src=http://www.jyguagua.com/wp-content/uploads/2023/08/demo_1-1024x711.jpg&w=280&h=210&zc=1)
![[转载]基础数据char,int,double,string是线程安全的吗?](http://www.jyguagua.com/wp-content/themes/begin/img/random/2.jpg)
![[整理]用c++编写的RDTSC性能计时器](http://www.jyguagua.com/wp-content/themes/begin/timthumb.php?src=http://www.jyguagua.com/wp-content/uploads/2020/12/rdtsc-assembly-example.jpg&w=280&h=210&zc=1)
![[整理]strcmp汇编写法](http://www.jyguagua.com/wp-content/themes/begin/img/random/17.jpg)