Trier un std::map par valeur
Trier un std::map par valeur plutôt que par clé peut être plus complexe que le tri par clé. Voici une analyse approfondie du problème et une solution :
Solution 1 : Utiliser une Multimap
Pour trier une std::map par valeur, nous pouvons créer une multimap avec les valeurs comme clés et les clés comme valeurs. Cela nous permet de trier par valeurs, comme dans l'exemple suivant :
template<typename A, typename B> std::multimap<B,A> flip_map(const std::map<A,B> &src) { std::multimap<B,A> dst; std::transform(src.begin(), src.end(), std::inserter(dst, dst.begin()), flip_pair<A,B>); return dst; }
En parcourant la carte d'origine et en insérant les paires inversées dans la multicarte, nous inversons essentiellement la relation clé-valeur et pouvons ensuite trier selon les nouvelles clés (les valeurs d'origine).
Solution 2 : Source Associative Générique (C 11 Obligatoire)
Pour les conteneurs associatifs alternatifs (par exemple, std::unordered_map), nous pouvons utiliser la solution générique suivante :
template<typename A, typename B, template<class,class,class...> class M, class... Args> std::multimap<B,A> flip_map(const M<A,B,Args...>& src) { std::multimap<B,A> dst; std::transform(src.begin(), src.end(), std::inserter(dst, dst.begin()), flip_pair<A,B>); return dst; }
Cette surcharge fonctionne à la fois pour std::map et std::unordered_map en utilisant des modèles variadiques pour gérer différents types de conteneurs associatifs.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!