Les pointeurs comme clés dans la carte C++ STL
J'ai une question sur comment pointeurs pour un objet personnalisé sont traités lorsqu'ils sont utilisés comme Clés dans une carte. Plus précisément, si je définir
std::map< CustomClass*, int > foo;
Serait la valeur par défaut C++ mise en œuvre pour gérer ces pointeurs? Ou ai-je besoin de définir une coutume comparateur de fonction pour gérer cela? En général, il est de bonne pratique d'utiliser des pointeurs vers des objets comme des clés?
- Tout ce qui soutient
less<T>
peut être utilisé dans une carte. Voir stackoverflow.com/questions/1098966/... - Un inconvénient possible en utilisant des indicateurs clés dans les cartes, c'est que l'ordre des éléments est non-déterministe (dépend de leur adresse de mémoire). Si vous avez besoin d'itérer sur les éléments d'un déterministe de l'ordre, vous ne pouvez pas utiliser les pointeurs comme des clés. Cela peut être important dans les jeux multijoueurs.
Vous devez vous connecter pour publier un commentaire.
Le défaut de mise en œuvre permettra de comparer les adresses enregistrées par les pointeurs, objets seront considérés comme des clés différentes. Cependant, la logique de l'état de l'objet ne seront pas considérées. Par exemple, si vous utilisez
std::string *
comme la clé, deuxstd::string
objets avec le même texte de"Hello"
serait considérée comme une clé différente! (Lorsqu'ils sont stockés dans la carte par leurs adresses)C'est ok d'utiliser des pointeurs comme des clés, aussi longtemps que vous comprenez la différence importante ci-dessus.
Pointeurs seront traitées, mais en comparaison de pointeurs (mémoire de l'ordre). Vous devez passer personnalisé
less
foncteur si vous souhaitez comparer les objets:C++ standard fourni par la spécialisation des
std::less
pour les pointeurs, donc oui, vous pouvez les utiliser comme carte de touches, etc.En laissant de côté de la légalité de cette et d'éventuels malentendus sémantiques, abordée déjà, je ne vois pas de raison d'utiliser
std::map
ici plutôt que destd::unordered_map
. Il y a déjà des interceptions de ce en Boost et Visual C++ si vous êtes sur un pré-compilateur C++11.Puisque vous semblez être l'aide d'un pointeur pour représenter un objet unique, quelque chose comme boost::mouche pourraient être applicables.
Pointeurs peuvent être utilisés comme clés, mais surtout avec une std::map (ou std::set), je vous le déconseille. Le comportement du programme n'est pas déterministe, c'est à dire lorsque l'on parcourt la carte de l'ordre dans lequel les éléments de la carte sont itérées n'est pas garanti d'être le même. Cela dépend vraiment de l'adresse mémoire de l'objet (clé). Jetez un oeil à cet exemple, comme vous pouvez le voir, indépendamment de l'ordre d'insertion dans la carte les éléments sont répétées de façon déterministe, lorsque la clé est une chaîne plutôt qu'un pointeur.
http://ideone.com/VKirct