如何按值对boost::unordered_map进行排序并仅按该顺序返回键?我有像boost::unordered_map这样的地图,我需要只需要按 asc/desc 中的 int 值排序的枚举列表。
问问题
4615 次
3 回答
3
unordered_map
顾名思义,An本质上不能就地排序或排序。您可以将值对插入到set
按值排序的 a 中并从那里获取键(使用 Boost.Range 使这些东西更容易)。我使用 astd::set<T*>
来不支付复制对对象的成本。
#include <iostream>
#include <set>
#include <unordered_map>
#include <boost/range/adaptor/map.hpp>
#include <boost/range/adaptor/indirected.hpp>
#include <boost/range/adaptor/transformed.hpp>
struct compare_second{
template<class Pair>
bool operator()(Pair* lhs, Pair* rhs) const{
return lhs->second < rhs->second;
}
};
template<class T>
struct make_pointer{
typedef T* result_type;
T* operator()(T& v) const{ return &v; }
};
int main(){
using namespace boost::adaptors;
std::unordered_map<int, int> m{{0,4},{1,3},{2,2},{3,1},{4,0}};
typedef std::unordered_map<int,int>::value_type pair_type;
auto p = m | transformed(make_pointer<pair_type>());
std::set<pair_type*, compare_second> value_ordered(p.begin(), p.end());
for(auto x : value_ordered | indirected | map_keys)
std::cout << x << " ";
}
于 2012-09-04T13:23:44.690 回答
2
您可以使用Boost Multi-Index Library。boost::multi_index_container 可以有有序状态和无序状态。
于 2012-09-05T01:06:18.483 回答
1
最简单的方法是将值复制到向量中并按映射类型对其进行排序:
std::vector<value_type> values(std::begin(map), std::end(map));
boost::sort(boost::make_range(values),
[](const value_type &x, const value_type &y) { return x.second < y.second; });
std::vector<key_type> keys;
boost::push_back(keys, boost::make_range(values) | boost::map_keys));
于 2012-09-04T13:22:33.677 回答