Как отсортировать ** boost :: unordered_map ** по значению и вернуть только ключи в этом порядке?

Как сортировать повышение :: unordered_map по значению и вернуть только ключи в таком порядке?
У меня есть карта как повышение :: unordered_map и мне нужно мне нужен только список перечислений, отсортированных по значениям int в asc / desc.

1

Решение

unordered_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 << " ";
}

Живой пример.

3

Другие решения

Ты можешь использовать Увеличить многоиндексную библиотеку.
boost :: multi_index_container может иметь упорядоченное и неупорядоченное состояние.

2

Самый простой способ — скопировать значения в вектор и отсортировать их по отображенному типу:

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));
1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector