2015-10-24 12 views
5

Ho la seguente funzione di modello che restituisce una copia della mappa data con i tasti e valori scambiati:Fare un lavoro di modello sia con std :: map e std :: unordered_map

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

C'è un modo di il modello sopra riportato funziona sia per std::map sia per std::unordered_map? Cioè, per std::map<K, V>, dovrebbe restituire std::map<V, K>, e per std::unordered_map<K, V>, dovrebbe restituire std::unordered_map<V, K>.

risposta

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

un buon inizio, ma che dire di allocatori, funzioni hash e predicati di confronto? –

+0

@RichardHodges funziona solo con mappe con predicato standard/hash/allocatore ... È difficile dire quale comparatore è stato utilizzato ecc. – ForEveR

+1

d'accordo. Penso che la complessità implicata in una soluzione corretta renda la soluzione più complessa del problema. probabilmente non è una funzione che dovrebbe essere definita. –

1

ci sono un paio di risposte qui quindi non ho intenzione di coprire vecchio terreno.

C'è tuttavia un aspetto di ciò che dovresti considerare attentamente.

Le mappe non ordinate non sono le stesse delle mappe - hanno il requisito che esista una funzione di hash per la chiave (oltre al predicato di uguaglianza). Come abbiamo visto, è banale scrivere una funzione template che presuppone le impostazioni predefinite, ma è quello che vuoi?

Se entrambe le K e V dispongono di funzioni hash, allora sono già chiavi. In tal caso, non è quello che volevi veramente un boost::bimap o boost::multi_index_map?

Problemi correlati