Maison > développement back-end > C++ > Comment puis-je utiliser les types définis par l'utilisateur comme clés dans C std :: maps ?

Comment puis-je utiliser les types définis par l'utilisateur comme clés dans C std :: maps ?

Patricia Arquette
Libérer: 2024-12-24 13:49:14
original
678 Les gens l'ont consulté

How Can I Use User-Defined Types as Keys in C   std::maps?

Types définis par l'utilisateur comme clés dans std::maps

Problème : erreur du compilateur cryptique lors de l'utilisation de cartes avec des types définis par l'utilisateur

En C En programmation, l'utilisation de cartes STL avec des classes définies par l'utilisateur rencontre souvent des erreurs énigmatiques du compilateur. Plus précisément, le message d'erreur « aucune correspondance pour 'operator<' in '__x < __y'" est courant lors de la tentative d'accès à un élément à l'aide d'une clé d'un type défini par l'utilisateur.

Comprendre l'erreur

Le message d'erreur suggère que le compilateur ne peut pas pour trouver l'opérateur < pour comparer deux instances du type défini par l'utilisateur. En effet, par défaut, les cartes STL nécessitent un opérateur de comparaison (operator<) pour trier leurs clés. Cependant, lorsque vous travaillez avec des types définis par l'utilisateur, cet opérateur n'est pas automatiquement disponible.

Solution 1 : Objet de fonction de comparaison

Au lieu de définir l'opérateur< pour un type défini par l'utilisateur, on peut créer une classe d'objets fonction comparateur. Cette classe implémente une version spécialisée de Operator() qui détermine l'ordre relatif du type défini par l'utilisateur. La carte peut ensuite être spécialisée pour utiliser ce comparateur :

struct Class1Compare {
   bool operator() (const Class1&amp; lhs, const Class1&amp; rhs) const {
       return lhs.id < rhs.id;
   }
};

std::map<Class1, int, Class1Compare> c2int;</p>
<h3>Solution 2 : Spécialiser std::less</h3>
<p>Une autre alternative consiste à spécialiser le modèle std::less pour le modèle défini par l'utilisateur taper. Cela fournit une définition personnalisée pour Operator() dans la classe std::less :</p>
<pre class="brush:php;toolbar:false">namespace std {
    template<> struct less<Class1> {
       bool operator() (const Class1&amp; lhs, const Class1&amp; rhs) const {
           return lhs.id < rhs.id;
       }
    };
}
Copier après la connexion

Cette approche permet à la carte d'utiliser par défaut std::less à des fins de comparaison, tout en fournissant une implémentation spécifique pour l'utilisateur. type défini.

Conclusion

Lorsque vous travaillez avec des cartes STL et des types définis par l'utilisateur, il est essentiel de fournir une méthode pour comparer les clés. Ceci peut être réalisé soit via un objet fonction de comparaison, soit en spécialisant std::less. En répondant à cette exigence, les développeurs peuvent utiliser efficacement des cartes avec des types définis par l'utilisateur comme clés.

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal