Que signifie itérateur-> seconde?

157

En C ++, quel est le type de a std::map<>::iterator?

On sait qu'un objet itde type std::map<A,B>::iteratora un surchargé operator ->qui renvoie a std::pair<A,B>*, et que le std::pair<>a un membre firstet second.

Mais à quoi correspondent ces deux membres et pourquoi devons-nous accéder à la valeur stockée dans la carte sous forme it->second?

Noich
la source
14
A std::mapstocke une clé et une valeur . map::iterator.secondfait référence à la valeur .
Alok Enregistrer

Réponses:

247

Je suis sûr que vous savez qu'un std::vector<X>stocke tout un tas d' Xobjets, non? Mais si vous avez un std::map<X, Y>, ce qu'il stocke en fait est 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 a std::map, vous itérez sur tous ces std::pairs. Lorsque vous déréférencer l'un de ces itérateurs, vous obtenez un std::paircontenant 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 obtiendrez le std::pairpour le premier élément de la carte.

Désormais, le type std::pairvous donne accès à ses éléments via deux membres: firstet second. Donc, si vous avez un std::pair<X, Y>appelé p, p.firstest un Xobjet et p.secondest un Yobjet.

Alors maintenant vous savez que déréférencer un std::mapitérateur vous donne un std::pair, vous pouvez alors accéder à ses éléments avec firstet second. Par exemple, (*it).firstvous donnera la clé et (*it).secondvous donnera la valeur. Ceux-ci sont équivalents à it->firstet it->second.

Joseph Mansfield
la source
4
Pourquoi n'utilisent-ils pas simplement [0] et [1] (pour «premier» et «deuxième») comme tout le reste dans la programmation?
21
@AdamCross Because operator[]doit renvoyer un type spécifique mais firstet secondpeut avoir différents types. D'autre part, std::tuplea une fonction d'assistance spéciale std::getpour accéder à ses éléments par index.
Joseph Mansfield
16

Le type des éléments d'un std::map(qui est également le type d'une expression obtenue en déréférençant un itérateur de cette carte) dont la clé est Ket la valeur Vest std::pair<const K, V>- la clé est constde vous éviter d'interférer avec le tri interne des valeurs de la carte.

std::pair<>a deux membres nommés firstet second(voir ici ), avec une signification assez intuitive. Ainsi, étant donné un itérateur ià une certaine carte, l'expression:

i->first

Ce qui équivaut à:

(*i).first

Fait référence au premierconst élément ( ) de l' pairobjet pointé par l'itérateur - c'est-à-dire qu'il fait référence à une clé de la carte. Au lieu de cela, l'expression:

i->second

Ce qui équivaut à:

(*i).second

Fait référence au deuxième élément de pair- c'est-à-dire à la valeur correspondante dans la carte.

Andy Prowl
la source
5
Les mots «clé» et «valeur» auraient été plus intuitifs que «premier» et «deuxième», qui impliquent un ordre.
ahoffer le