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::pairs. 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.