Maison >développement back-end >C++ >Comment puis-je utiliser des types personnalisés définis par l'utilisateur comme clés dans C Maps ?

Comment puis-je utiliser des types personnalisés définis par l'utilisateur comme clés dans C Maps ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-29 05:16:15667parcourir

How Can I Use Custom User-Defined Types as Keys in C   Maps?

Types personnalisés définis par l'utilisateur en tant que clés de carte en C

Les cartes de la bibliothèque standard C fournissent des opérations de recherche et d'insertion efficaces pour les valeurs-clés paires. Cependant, lorsqu'ils tentent d'utiliser des classes définies par l'utilisateur comme clés de mappage, les développeurs peuvent rencontrer des messages d'erreur énigmatiques en raison de l'absence d'une fonction de comparaison appropriée.

Un message d'erreur courant est : "aucune correspondance pour 'operator<' dans '__x < Cette erreur se produit car la carte nécessite un comparateur ou un opérateur de comparaison (tel que Operator<) pour déterminer l'ordre des clés.

Par défaut, les cartes utilisent le paramètre de modèle de comparateur std::less pour définir l'ordre des clés. . Si le type de clé fournit l'opérateur < surcharge, std::less lui déléguera la comparaison. Cependant, pour les types définis par l'utilisateur, il n'est pas toujours approprié de surcharger l'opérateur<.

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

  1. Comparateur Function Object : créez une classe distincte qui implémente la comparaison spécifique à votre type défini par l'utilisateur. Dans le code fourni, une classe Class1Compare est définie avec une fonction Operator() qui compare les instances Class1 en fonction de leurs membres ID.

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

    Ensuite, lors de l'instanciation de la carte, spécifiez l'objet fonction de comparaison comme troisième paramètre de modèle :

    std::map<Class1, int, Class1Compare> c2int;</p>
    <li>
    <p><strong>Spécialisation du modèle de std::less</strong> : Une autre option consiste à spécialiser le modèle std::less pour votre type défini par l'utilisateur. Cela vous permet de définir la logique de comparaison directement dans l'espace de noms std.</p>
    <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 spécialisant std::less, vous pouvez éviter d'exposer un opérateur explicite< surchargez d'autres parties de votre code, rendant votre logique de comparaison plus encapsulée.

  2. En utilisant l'une de ces approches, vous pouvez surmonter les limitations liées à l'utilisation de types définis par l'utilisateur comme clés de mappage et gagner les avantages des fonctionnalités de cartographie efficaces de la bibliothèque standard C.

    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