7
votes

Besoin d'aide pour comprendre l'utilisation de la carte C ++ en tant que tableau associatif

Je traversais Josuttis "en utilisant la carte des tableaux associatifs" (de La bibliothèque standard C ++ - un tutoriel et une référence, 2e édition ) et est venu sur Utiliser une STD :: Carte en tant que Array associatif sur le débordement de la pile. Maintenant, j'ai plus de questions sur les constructeurs qui sont appelés lors de l'insertion dans une carte.

Voici mon exemple de programme (n'utilisant pas de meilleures pratiques de codage; veuillez m'excuser pour cela): P>

Inserting using index
default
copy constr
copy constr
copy initializer


4 commentaires

Vous n'avez pas besoin de tester la construction de copie à soi-même.


En fait, je comprends maintenant qu'il est préférable d'avoir des pointeurs que d'objets dans des conteneurs STL.


@mithuna: AVERTISSEMENT: Stockage des pointeurs au lieu d'objets apporte des problèmes de gestion à vie, alors je dirais qu'il est préférable de stocker des objets. Si Ceci provoque des problèmes de performance, vous devez voir si la copie peut être optimisée. Ensuite, si il ne peut pas, vous pouvez envisager de stocker des pointeurs au lieu d'objets. Dans ce cas, vous pouvez être intéressé par la bibliothèque Boost.PompanContainer ( BOOST.ORG/DOC/LIBS/1_40_0/LIBS/PTR_CONTAINER/DOC/... ). pTR_MAP ( boost.org/doc/libs/1_40_0/ LIBS / PTR_CONTAINER / DOC / PTR_MAP.HT ML ), dans le cas présent.


... Ou si vous avez accès à un, utilisez une implémentation qui prend en charge la sémantique de déplacement de C ++ 0x.


4 Réponses :


0
votes

Que se passe-t-il si vous exécutez simplement la carte [1]; ? Cela peut impliquer des copies internes, en fonction de la mise en œuvre de mapper votre bibliothèque standard utilise.


0 commentaires

2
votes

Don; t sais. Mais c'est intéressant:

Inserting using index
default
copy constr()
copy constr()
one param(Plop)
copy initializer      copy constr(Plop)


0 commentaires

8
votes

Si vous lisez la spécification de STD :: Carte, il est indiqué que l'opérateur [] est équivalent à (dans ce cas) xxx

donc cela explique que tous les appels de constructeur que vous voyez. Tout d'abord, il appelle le constructeur par défaut C (). Alors il appelle make_pair, qui copie l'objet C. Ensuite, il appelle l'insertion, ce qui rend une copie de l'objet paire que vous venez de faire, appelant à nouveau le constructeur de copie C. Enfin, il appelle l'opérateur d'affectation pour définir l'objet inséré sur celui que vous l'attribuez à.


3 commentaires

Même chose que ma réponse, seulement mieux! +1 et la mine supprimée.


Belle réponse, re-lisez la spécification et cela a eu beaucoup de sens maintenant.


Est-il raisonnable de supposer qu'avec une option -o, nous pourrions seulement obtenir un appel de la construction de copie? Notez que pour de meilleures performances, vous pouvez utiliser itérateur insert (itérateur pos, valeur_type const & x) POS peut être déduit en utilisant itérateur inférieur_bound (key_type const &) (et prenant son prédécesseur si cela est valide). Vous éviteriez ainsi la construction et l'affectation par défaut sans tomber dans le piège de recherche double.



0
votes

En réalité map1 [1] = obj créera paire d'abord


0 commentaires