[英]How to sort a std::map by ascending order of value?
我试图找出如何按升序对std::map
进行排序。
我的代码:
#include <iostream>
#include <map>
#include <string>
#include <iterator>
void printMapByOrder(std::map<std::string, int> mapOfPlanets)
{
//what should be here?
}
int main() {
std::map<std::string, int> mapOfPlanets;
mapOfPlanets["earth"] = 12;
mapOfPlanets["jupiter"] = 142;
mapOfPlanets["mars"] = 6;
mapOfPlanets["mercury"] = 4;
mapOfPlanets["neptune"] = 49;
mapOfPlanets["pluto"] = 2;
mapOfPlanets["saturn"] = 120;
mapOfPlanets["uranus"] = 51;
mapOfPlanets["venus"] = 12;
printMapByOrder(mapOfPlanets);
}
我想要的结果:
pluto : 2
mercury : 4
mars : 6
earth : 12
venus : 12
neptune : 49
uranus : 51
saturn : 120
jupiter : 142
这有可能用std::map
做到吗?
不能。无法按值对地图进行排序。
一种可能的解决方案:
void printMapByOrder(std::map<std::string, int> mapOfPlanets)
{
std::vector < std::pair<std::string, int> > planets(mapOfPlanets.begin(), mapOfPlanets.end());
std::sort(planets.begin(), planets.end(), [](auto lhs, auto rhs) {return lhs.second < rhs.second; });
//print planets
}
std::map
由其key排序,并且不能更改(毕竟,map的点是可以通过key快速访问的 )。 但是,您可以创建一个指向地图元素的指针容器,并对其进行排序以进行打印。 您将要通过const引用传递地图,以使指针不会失效:
#include <algorithm>
#include <vector>
void printMapByOrder(const std::map<std::string, int>& mapOfPlanets)
{
using element = typename std::map<std::string, int>::value_type;
std::vector<const element*> sorted;
sorted.reserve(mapOfPlanets.size());
for (auto& planet: mapOfPlanets)
sorted.push_back(&planet);
# sort by value
std::sort(sorted.begin(), sorted.end(),
[](auto *a, auto *b) {
return std::tie(a->second, a->first)
< std::tie(b->second, b->first);
});
# print results
std::transform(sorted.begin(), sorted.end(),
std::ostream_iterator<std::string>(std::cout),
[](const auto *p) {
return p->first + ": "
+ std::to_string(p->second) + '\n';
});
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.