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

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

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-22 18:14:14779parcourir

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

Surmonter les obstacles : utiliser std::maps avec des types définis par l'utilisateur comme clés

Dans le domaine du mappage de paires clé-valeur en C , il n'est pas rare de rencontrer des situations dans lesquelles les types définis par l'utilisateur sont préférés pour définir les clés. Cependant, lorsque vous tentez d'utiliser std::maps avec des clés définies par l'utilisateur, un message d'erreur énigmatique peut apparaître lors de la compilation. Pour comprendre cette erreur et sa signification, examinons les nuances de std::maps et les types définis par l'utilisateur.

Lorsque nous travaillons avec std::maps, nous nous appuyons souvent sur des types primitifs comme clés, tels que des entiers. ou des chaînes. Les types primitifs ont des opérateurs de comparaison bien définis (<, >, ==, etc.) qui facilitent un classement efficace des clés dans la carte. Cependant, lors de l'utilisation de types définis par l'utilisateur comme clés, il est important de noter que l'implémentation de ces opérateurs de comparaison est cruciale pour le bon fonctionnement de la carte. C'est là qu'intervient le message d'erreur que vous avez rencontré.

L'erreur mentionnée dans la question fait allusion à l'absence d'opérateur< implémentation pour la Class1 définie par l'utilisateur. Par défaut, std::maps s'appuie sur less<> modèle pour comparer les clés. moins≪> appelle en interne l'opérateur< défini pour le type de clé. Malheureusement, Class1 ne dispose pas de cet opérateur, ce qui entraîne une erreur de compilation.

Pour résoudre ce problème, il existe plusieurs solutions viables :

  1. Opérateur d'implémentation<: Définir un opérateur≪ fonction membre au sein de Class1 qui établit un critère de comparaison pour l’ordre des clés. Cependant, il convient de se demander si la fourniture à l'opérateur< pour votre classe a du sens d'un point de vue logique.
  2. Utilisation d'un objet fonction de comparaison : Au lieu d'implémenter l'opérateur<, créez un objet fonction de comparaison distinct qui encapsule la logique de comparaison. Cela permet une plus grande flexibilité et une plus grande modularité du code. Un exemple d'une telle approche est présenté dans l'extrait de code suivant :
struct Class1Compare {
    bool operator() (const Class1& lhs, const Class1& rhs) const {
        return lhs.id < rhs.id;
    }
};

std::map<Class1, int, Class1Compare> c2int;</p>
<ol start="3"><li>
<strong>Spécialisation std::less :</strong> Si la sémantique de comparaison n'est pas cruciale pour votre utilisation Dans ce cas, envisagez de spécialiser le modèle std::less pour Class1. Cette approche permet de définir les critères de comparaison en dehors de la portée de Class1, ce qui rend le code plus extensible.</li></ol>
<pre class="brush:php;toolbar:false">namespace std {
    template<> struct less<Class1> {
        bool operator() (const Class1& lhs, const Class1& rhs) const {
            return lhs.id < rhs.id;
        }
    };
}

En employant l'une de ces approches, vous pouvez surmonter l'erreur et utiliser avec succès std : :maps avec des types définis par l'utilisateur comme clés. Il est important de choisir la solution qui correspond le mieux aux exigences et aux principes de conception de votre projet.

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:
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