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?

118
demandé sur Nicholas Wilson 2013-03-16 19:54:51

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.

189
répondu Joseph Mansfield 2013-03-16 16:04:19

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.

13
répondu Andy Prowl 2017-04-11 10:46:20