Quand une "clé/valeur" est inséré dans une std::map`, fait-il sa propre copie de l'objet?

Cela est inspiré par un Élément Efficace de C# de la première édition, avertissement sur la substitution GetHashCode() naïvement.

Désolé, je n'ai pas le code de prise en charge. Par ailleurs, ce n'est pas des devoirs à faire, je ne suis pas familier avec C++/STL, et ne pouvait pas trouver des informations concernant la mise en œuvre.

Supposons que je crée ma propre classe nom d'une personne qui a 3 public mutable champs de type chaîne:

  • Prénom,
  • Initiale
  • Nom De Famille

Il fournit également un opérateur inférieur à comparer une personne à l'autre basé sur le prénom en premier, puis deuxième prénom, puis le nom de famille c'est tout.

J'ai créer une map à partir de la personne à int (dire l'âge), et le remplir avec quelque 20 paires clé/valeur. J'ai également stocker des pointeurs vers mes clés dans un tableau. J'ai ensuite modifier le premier nom d'un objet que dire de la cinquième pointeur de points, et essayer de trouver un correspondant de l'âge à l'aide de cette clé modifiée (rappelez-vous l'objet est mutable et grand ouvert).

Pourquoi est-ce arrivé?

A) Parce que la clé utilisée par std::map n'a pas changé (a été copié), et j'ai changé mon propre copie et maintenant, ma clé n'est pas trouvée. Mais comment cela peut-il être? Je n'ai pas donné mon propre constructeur de copie. Peut-être un défaut a été créé par le compilateur?

B) La std::map collection est en fait un Rouge-Noir de l'arbre, et il m'est arrivé d'avoir un pointeur direct à une touche. Quand j'ai changé la clé, je l'ai changé directement dans le nœud d'un arbre. Maintenant, il est probable que mon nœud n'est pas positionné correctement, et ne sera pas trouvée à l'aide d'un bon arbre de l'algorithme de recherche. Je devrais avoir supprimé le nœud, puis modifié, il touche, et puis re-inséré à nouveau. Si c'est le cas, alors je soupçonne que STL collections en général sont plutôt dangereux et causer des noobs de faire beaucoup d'erreurs.

C) autre Chose?

Je vous serais reconnaissant de vos idées.

Quels types de données que vous utilisez dans votre clé? Vous dites chaîne mais pour être clair, sont-ils std::les chaînes de caractères? Si oui, est correct -- conteneurs STL en fera des copies de toutes les données dans la clé et la valeur.

OriginalL'auteur Hamish Grubijan | 2011-04-16