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 Réponses :
Que se passe-t-il si vous exécutez simplement la carte [1]; code>? Cela peut impliquer des copies internes, en fonction de la mise en œuvre de
mapper code> votre bibliothèque standard utilise. P>
Don; t sais. Mais c'est intéressant:
Inserting using index default copy constr() copy constr() one param(Plop) copy initializer copy constr(Plop)
Si vous lisez la spécification de STD :: Carte, il est indiqué que l'opérateur [] est équivalent à (dans ce cas) 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 à. P> p>
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) code> où
POS code> peut être déduit en utilisant
itérateur inférieur_bound (key_type const &) code > (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.
En réalité map1 [1] = obj code> créera
paire code> d'abord p>
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 i> Ceci provoque des problèmes de performance, vous devez voir si la copie peut être optimisée. Ensuite, si i> 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.