Ne std::map::iterator retourner une copie de la valeur ou une valeur en soi?
Je suis en train de créer une carte à l'intérieur d'une carte:
typedef map<float,mytype> inner_map;
typedef map<float,inner_map> outer_map;
Vais-je être capable de mettre quelque chose à l'intérieur de intérieur de la carte, ou ne iterator::la seconde renvoie une copie?
stl_pair.h suggère celui-ci:
74: _T2 second; ///< @c second is a copy of the second object
mais mon programme de test fonctionnent très bien avec le code comme ceci:
it = my_map.lower_bound(3.1415);
(*it).second.insert(inner_map::value_type(2.71828,"Hello world!");
Alors, où est la vérité? Est-ce une copie ou pas?
Vous devez vous connecter pour publier un commentaire.
Le commentaire dans
stl_pair.h
est trompeur dans ce cas précis.Il y aura pas copie, depuis le
map::iterator
se réfère effectivement à la de données d'origine à l'intérieur de la carte (lavalue_type
, qui lui-même est unpair
), ce n'est pas une copie. Ainsiiterator::second
également fait référence à l'origine des données.stl_pair.h
la documentation ne fait pas référence àstd::map
à tous, et il se comporte de cette façon parce questd::map::find
renvoie un référence pour unestd::pair
c'est stockée à l'intérieur de la carte. Ainsi, lesecond
membre de la paire est toujours une valeur (et non pas une référence), c'est la paire en elle-même qui est la référence. La “copie de la deuxième élément” dans la documentation se réfère au fait questd::pair::second
détient une copie de quelque valeur que ce soit, il a été adopté par le constructeur.A reference is the object. It is not a pointer to the object, nor a copy of the object. It is the object.
Une référence n'est pas une copie. L'élément que je comprends, c'est d'appeler les "vies" dans la carte, il n'en est pas passé à la fonction qui l'a ajouté dans la carte (qui pourrait tout aussi bien ne pas exister, si emplace ont été utilisés).second
ne dispose pas d'un type de référence. Il est vrai que la carte peut contenir une valeur qui n'existait pas auparavant, mais tout d'abord, cette question/réponse est antérieure à la sémantique de déplacement, et d'autre part cela ne change pas le fait que le commentaire qui nous intéresse ici ne s'applique pas auxmap
à tous.Je veux ajouter un suivi de la réponse à cette question pour les gens à l'aide de C++11 itérateurs...
Le code suivant:
ne copier la clé et la valeur, étant donné que "auto" est la valeur par défaut, pas un const référence (au moins, c'est comment il se comporte clang 3.1).
En outre, le code:
aussi des copies de la clé et de la valeur depuis le code correct doit être:
ou
La
value_type
une carte est une paire, il a donc les membres de la première et de la deuxième. Comme avec tous les itérateurs, une carte itérateur est un pseudo-pointeur, c'est à dire qu'il pointe vers les données au sein d'une collection et non des copies de ces données.Il est presque certain en interne pour contenir des pointeurs plutôt que de références en raison du fait que les itérateurs peuvent être ré-attribuée (c'est ce que vous les utilisez) et vous ne pouvez pas réaffecter les références à d'autres objets.
Même si vous avez un const_iterator et le type en-dessous est POD, il doit avoir un pointeur sur elle, au cas où quelqu'un ne ce:
Le comportement devrait être défini et de sortie 3, ce qui n'arriverait pas si le const_iterator décidé à "optimiser" après tout, c'est const et seulement int...
Itérateurs, quand déréférencé, vous donner une référence.