使模板适用于std :: map和std :: unordered_map

时间:2015-10-24 07:52:32

标签: c++

我有以下模板函数,它返回给定地图的副本,其中包含交换的键和值:

template<typename M>
auto swapKeysAndValues(const M& m) {
    std::map<typename M::mapped_type, typename M::key_type> swapped;
    for (auto& p : m) {
        swapped.emplace(p.second, p.first);
    }
    return swapped;
}

有没有办法让上述模板同时适用于std::mapstd::unordered_map?也就是说,对于std::map<K, V>,它应该返回std::map<V, K>,对于std::unordered_map<K, V>,它应该返回std::unordered_map<V, K>

2 个答案:

答案 0 :(得分:4)

template<template <typename...> class Map, typename K, typename V>
auto swapKeyValues(const Map<K, V>& map)
{
    Map<V, K> result;
    for (const auto& p : map) result.emplace(p.second, p.first);
    return result;
}

Live example

答案 1 :(得分:1)

这里有几个答案,所以我不打算介绍旧的。

然而,你应该仔细考虑这方面的一个方面。

无序映射与映射不同 - 它们要求密钥存在散列函数(除了等式谓词)。正如我们所看到的,编写一个假定默认值的模板函数是微不足道的,但这是你想要的吗?

如果你的K和V都有可用的哈希函数,那么它们已经是键。在这种情况下,不是您真正想要的boost::bimapboost::multi_index_map

相关问题