Maison > développement back-end > C++ > Comment puis-je trier efficacement un `std::map` par valeur en C ?

Comment puis-je trier efficacement un `std::map` par valeur en C ?

DDD
Libérer: 2024-12-02 09:29:10
original
138 Les gens l'ont consulté

How Can I Efficiently Sort a `std::map` by Value in C  ?

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);
}
Copier après la connexion

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;
}
Copier après la connexion

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!
Copier après la connexion

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;
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal