WarptenLe 07/09/2018 à 00:08
namespace std
{
template <typename Key,
typename T,
typename Hash = hash<Key>,
typename KeyEqual = equal_to<Key>,
template <typename> typename Allocator = allocator>
struct map_traits
{
using allocator_t = Allocator<pair<const Key, T>>;
using value_allocator = Allocator<T>;
};
namespace {
template <typename Key, typename T, typename U = T, typename... Ts>
auto to_u_vector(std::unordered_map<Key, T, Ts...> const& map)
{
using map_traits_t = map_traits<Key, T, Ts...>;
using vector_type = vector<T, typename map_traits_t::value_allocator>;
auto mutator = [](pair<const Key, T> const& kv) -> U { return std::get<U>(kv); };
auto itr = boost::make_transform_iterator(map.begin(), mutator);
auto end = boost::make_transform_iterator(map.end(), mutator);
vector_type range(itr, end);
return range;
}
}
template <typename Key, typename T, typename... Ts>
inline auto to_value_vector(std::unordered_map<Key, T, Ts...> const& map)
{
return to_u_vector<T>(map);
}
template <typename Key, typename T, typename... Ts>
inline auto to_key_vector(std::unordered_map<Key, T, Ts...> const& map)
{
return to_u_vector<Key>(map);
}
}