使用值对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?
3 回答
MMTTMM
TA贡献1869条经验 获得超4个赞
尽管已经发布了正确答案,但我想我会添加一个如何干净利落地演示的演示:
template<typename A, typename B>std::pair<B,A> flip_pair(const std::pair<A,B> &p){ return std::pair<B,A>(p.second, p.first);}template<typename A, typename B>std::multimap<B,A> flip_map(const std::map<A,B> &src){ std::multimap<B,A> dst; std::transform(src.begin(), src.end(), std::inserter(dst, dst.begin()), flip_pair<A,B>); return dst;}int main(void){ std::map<int, double> src; ... std::multimap<double, int> dst = flip_map(src); // dst is now sorted by what used to be the value in src!}
通用关联源(需要C ++ 11)
如果您正在使用std::map
源关联容器的替代(例如std::unordered_map
),您可以编写单独的重载,但最后操作仍然是相同的,因此使用可变参数模板的通用关联容器可用于任一映射构造:
// flips an associative container of A,B pairs to B,A pairstemplate<typename A, typename B, template<class,class,class...> class M, class... Args>std::multimap<B,A> flip_map(const M<A,B,Args...> &src){ std::multimap<B,A> dst; std::transform(src.begin(), src.end(), std::inserter(dst, dst.begin()), flip_pair<A,B>); return dst;}
这将适用于 翻转std::map
和std::unordered_map
翻转的来源。
小怪兽爱吃肉
TA贡献1852条经验 获得超1个赞
我需要类似的东西,但翻转的地图对我不起作用。我只是将我的地图(下面的频率)复制到一对矢量中,然后对我想要的对进行排序。
std::vector<std::pair<int, int>> pairs;for (auto itr = freq.begin(); itr != freq.end(); ++itr) pairs.push_back(*itr);sort(pairs.begin(), pairs.end(), [=](std::pair<int, int>& a, std::pair<int, int>& b){ return a.second < b.second;});
RISEBY
TA贡献1856条经验 获得超5个赞
我喜欢Oli的答案(翻转地图),但似乎有问题:容器地图不允许两个元素具有相同的键。
解决方案是使dst成为类型multimap。另一个是将src转储到向量中并对向量进行排序。前者需要对Oli的答案进行微小的修改,而后者可以简洁地使用STL副本来实现
#include <iostream>#include <utility>#include <map>#include <vector>#include <algorithm>using namespace std;int main() { map<int, int> m; m[11] = 1; m[22] = 2; m[33] = 3; vector<pair<int, int> > v; copy(m.begin(), m.end(), back_inserter<vector<pair<int, int> > >(v)); for (size_t i = 0; i < v.size(); ++i) { cout << v[i].first << " , " << v[i].second << "\n"; } return 0;};
- 3 回答
- 0 关注
- 2230 浏览
添加回答
举报
0/150
提交
取消