1

boost :: unordered_mapを値でソートし、その順序でキーのみを返す方法は?boost :: unordered_mapのようなマップがあり、asc/descのint値でソートされた列挙型のリストが必要です。

4

3 に答える 3

3

Anunordered_mapは、その名前が示すように、本質的にソートされていないか、インプレースでソート可能ではありません。値でソートされたに値のペアを挿入し、setそこからキーを取得できます(Boost.Rangeを使用してこれを簡単にします)。std::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

BoostMulti-IndexLibraryを使用できます。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 に答える