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?


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.


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.


5
Les mots «clé» et «valeur» auraient été plus intuitifs que «premier» et «deuxième», qui impliquent un ordre.
ahoffer le
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.