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