Trier std::map par valeur
Trier un std::map par valeur, plutôt que par clé, est une exigence courante dans divers scénarios de programmation. Cet article fournit une solution élégante à ce problème en retournant les paires clé et valeur dans la carte à l'aide de fonctions de modèle personnalisées.
Fonctions de modèle personnalisées pour inverser les paires et les cartes
La solution fournie implique deux fonctions de modèle personnalisées : flip_pair() et flip_map(). La fonction flip_pair() prend une paire de valeurs et les retourne, ce qui donne une nouvelle paire avec les valeurs échangées.
template<typename A, typename B> std::pair<B,A> flip_pair(const std::pair<A,B> &p) { return std::pair<B,A>(p.second, p.first); }
La fonction flip_map() utilise la fonction flip_pair() pour retourner toutes les valeurs clés. paires de valeurs dans la carte source et renvoie une nouvelle multicarte avec les paires inversées.
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; }
Exemple Utilisation
Pour trier un std::map par valeur, on peut utiliser la fonction flip_map() pour créer une nouvelle multimap avec les paires inversées. Cette multimap sera triée selon les anciennes valeurs de la carte source.
std::map<int, double> src; ... std::multimap<double, int> dst = flip_map(src); // dst is now sorted by what used to be the value in src!
Source associative générique pour C 11 et versions ultérieures
Pour les conteneurs associatifs alternatifs à std : :map, comme std::unordered_map, une fonction plus générique peut être utilisée pour gérer à la fois std::map et std::unordered_map sources.
// flips an associative container of A,B pairs to B,A pairs 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 fonction peut être utilisée avec n'importe quel conteneur associatif prenant en charge les paramètres de modèle requis, tels que std::map, std::unordered_map, etc.
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!