我有以下模板函数,它返回给定地图的副本,其中包含交换的键和值:
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::map
和std::unordered_map
?也就是说,对于std::map<K, V>
,它应该返回std::map<V, K>
,对于std::unordered_map<K, V>
,它应该返回std::unordered_map<V, K>
。
答案 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;
}
答案 1 :(得分:1)
这里有几个答案,所以我不打算介绍旧的。
然而,你应该仔细考虑这方面的一个方面。
无序映射与映射不同 - 它们要求密钥存在散列函数(除了等式谓词)。正如我们所看到的,编写一个假定默认值的模板函数是微不足道的,但这是你想要的吗?
如果你的K和V都有可用的哈希函数,那么它们已经是键。在这种情况下,不是您真正想要的boost::bimap
或boost::multi_index_map
?