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
243 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!

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