Que signifie iterator->second?
En C++, quel est le type de std::map<>::iterator
?
Nous savons qu'un objet it
de type std::map<A,B>::iterator
a une surcharge operator ->
qui retourne std::pair<A,B>*
, et que l' std::pair<>
est un first
et second
membre.
Mais, à quoi correspondent ces deux membres, et pourquoi devons-nous Accéder à la valeur stockée dans la carte comme it->second
?
2 réponses
Je suis sûr que vous savez qu'un std::vector<X>
stocke tout un tas d'objets X
, non? Mais si vous avez un std::map<X, Y>
, ce qu'il stocke en fait est tout un tas de std::pair<const X, Y>
S. c'est exactement ce qu'est une carte - elle associe les clés et les valeurs associées.
Lorsque vous itérez sur un std::map
, vous itérez sur tous ces std::pair
s. Lorsque vous déréférencez l'un de ces itérateurs, vous obtenez un std::pair
contenant la clé et sa valeur associée.
std::map<std::string, int> m = /* fill it */;
auto it = m.begin();
Ici, si vous le faites maintenant *it
, vous le ferez obtenir le std::pair
pour le premier élément de la carte.
Maintenant, le type de std::pair
vous donne accès à ses éléments par le biais de deux membres: first
et second
. Donc, si vous avez un std::pair<X, Y>
, appelé p
, p.first
est un X
objet et p.second
est un Y
objet.
Maintenant que vous savez que le déréférencement d'un itérateur std::map
vous donne un std::pair
, Vous pouvez alors accéder à ses éléments avec first
et second
. Par exemple, (*it).first
vous donnera les clés et (*it).second
vous donnera la valeur. Ce sont équivalent à it->first
et it->second
.
Le type des éléments de std::map
(qui est aussi le type d'une expression obtenue par référence à un itérateur de cette carte) dont la clé est de K
est V
est std::pair<const K, V>
- la clé est de const
, pour vous éviter d'interférer avec le tri interne des valeurs de la carte.
std::pair<>
a deux membres nommés first
et second
(voir ici), avec une interface intuitive de sens. Ainsi, étant donné un itérateur i
à une certaine carte, l'expression:
i->first
Qui est équivalent à:
(*i).first
Fait référence à la première (const
) élément de la pair
objet pointé par l'itérateur - dire qu'elle se réfère à un clé dans la carte. Au lieu de cela, l'expression:
i->second
, Qui est équivalent à:
(*i).second
Fait référence à la deuxième élément de la pair
- c'est à dire le correspondant valeur dans la carte.