使用值对std :: map进行排序

使用值对std :: map进行排序

我需要std::map按值而不是按键排序。有一个简单的方法吗?

map<long, double> testMap;

// some code to generate the values in the map.


sort(testMap.begin(), testMap.end());  // is there any function like this to sort the map?


守候你守候我
浏览 2231回答 3
3回答

MMTTMM

尽管已经发布了正确答案,但我想我会添加一个如何干净利落地演示的演示:template<typename&nbsp;A,&nbsp;typename&nbsp;B>std::pair<B,A>&nbsp;flip_pair(const&nbsp;std::pair<A,B>&nbsp;&p){ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;std::pair<B,A>(p.second,&nbsp;p.first);}template<typename&nbsp;A,&nbsp;typename&nbsp;B>std::multimap<B,A>&nbsp;flip_map(const&nbsp;std::map<A,B>&nbsp;&src){ &nbsp;&nbsp;&nbsp;&nbsp;std::multimap<B,A>&nbsp;dst; &nbsp;&nbsp;&nbsp;&nbsp;std::transform(src.begin(),&nbsp;src.end(),&nbsp;std::inserter(dst,&nbsp;dst.begin()),&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flip_pair<A,B>); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;dst;}int&nbsp;main(void){ &nbsp;&nbsp;&nbsp;&nbsp;std::map<int,&nbsp;double>&nbsp;src; &nbsp;&nbsp;&nbsp;&nbsp;...&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;std::multimap<double,&nbsp;int>&nbsp;dst&nbsp;=&nbsp;flip_map(src); &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;dst&nbsp;is&nbsp;now&nbsp;sorted&nbsp;by&nbsp;what&nbsp;used&nbsp;to&nbsp;be&nbsp;the&nbsp;value&nbsp;in&nbsp;src!}通用关联源(需要C ++ 11)如果您正在使用std::map源关联容器的替代(例如std::unordered_map),您可以编写单独的重载,但最后操作仍然是相同的,因此使用可变参数模板的通用关联容器可用于任一映射构造://&nbsp;flips&nbsp;an&nbsp;associative&nbsp;container&nbsp;of&nbsp;A,B&nbsp;pairs&nbsp;to&nbsp;B,A&nbsp;pairstemplate<typename&nbsp;A,&nbsp;typename&nbsp;B,&nbsp;template<class,class,class...>&nbsp;class&nbsp;M,&nbsp;class...&nbsp;Args>std::multimap<B,A>&nbsp;flip_map(const&nbsp;M<A,B,Args...>&nbsp;&src){ &nbsp;&nbsp;&nbsp;&nbsp;std::multimap<B,A>&nbsp;dst; &nbsp;&nbsp;&nbsp;&nbsp;std::transform(src.begin(),&nbsp;src.end(), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::inserter(dst,&nbsp;dst.begin()), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flip_pair<A,B>); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;dst;}这将适用于&nbsp;翻转std::map和std::unordered_map翻转的来源。

小怪兽爱吃肉

我需要类似的东西,但翻转的地图对我不起作用。我只是将我的地图(下面的频率)复制到一对矢量中,然后对我想要的对进行排序。std::vector<std::pair<int,&nbsp;int>>&nbsp;pairs;for&nbsp;(auto&nbsp;itr&nbsp;=&nbsp;freq.begin();&nbsp;itr&nbsp;!=&nbsp;freq.end();&nbsp;++itr) &nbsp;&nbsp;&nbsp;&nbsp;pairs.push_back(*itr);sort(pairs.begin(),&nbsp;pairs.end(),&nbsp;[=](std::pair<int,&nbsp;int>&&nbsp;a,&nbsp;std::pair<int,&nbsp;int>&&nbsp;b){ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;a.second&nbsp;<&nbsp;b.second;});

RISEBY

我喜欢Oli的答案(翻转地图),但似乎有问题:容器地图不允许两个元素具有相同的键。解决方案是使dst成为类型multimap。另一个是将src转储到向量中并对向量进行排序。前者需要对Oli的答案进行微小的修改,而后者可以简洁地使用STL副本来实现#include&nbsp;<iostream>#include&nbsp;<utility>#include&nbsp;<map>#include&nbsp;<vector>#include&nbsp;<algorithm>using&nbsp;namespace&nbsp;std;int&nbsp;main()&nbsp;{ &nbsp;&nbsp;map<int,&nbsp;int>&nbsp;m; &nbsp;&nbsp;m[11]&nbsp;=&nbsp;1; &nbsp;&nbsp;m[22]&nbsp;=&nbsp;2; &nbsp;&nbsp;m[33]&nbsp;=&nbsp;3; &nbsp;&nbsp;vector<pair<int,&nbsp;int>&nbsp;>&nbsp;v; &nbsp;&nbsp;copy(m.begin(), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m.end(), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;back_inserter<vector<pair<int,&nbsp;int>&nbsp;>&nbsp;>(v)); &nbsp;&nbsp;for&nbsp;(size_t&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;v.size();&nbsp;++i)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;<<&nbsp;v[i].first&nbsp;<<&nbsp;"&nbsp;,&nbsp;"&nbsp;<<&nbsp;v[i].second&nbsp;<<&nbsp;"\n"; &nbsp;&nbsp;} &nbsp;&nbsp;return&nbsp;0;};
打开App,查看更多内容
随时随地看视频慕课网APP