En C ++, quel est le type de a std::map<>::iterator
?
On sait qu'un objet it
de type std::map<A,B>::iterator
a un surchargé operator ->
qui renvoie a std::pair<A,B>*
, et que le std::pair<>
a un membre first
et second
.
Mais à quoi correspondent ces deux membres et pourquoi devons-nous accéder à la valeur stockée dans la carte sous forme it->second
?
std::map
stocke une clé et une valeur .map::iterator.second
fait référence à la valeur .Réponses:
Je suis sûr que vous savez qu'un
std::vector<X>
stocke tout un tas d'X
objets, non? Mais si vous avez unstd::map<X, Y>
, ce qu'il stocke en fait est un tas destd::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 cesstd::pair
s. Lorsque vous déréférencer l'un de ces itérateurs, vous obtenez unstd::pair
contenant la clé et sa valeur associée.Ici, si vous le faites maintenant
*it
, vous obtiendrez lestd::pair
pour le premier élément de la carte.Désormais, le type
std::pair
vous donne accès à ses éléments via deux membres:first
etsecond
. Donc, si vous avez unstd::pair<X, Y>
appelép
,p.first
est unX
objet etp.second
est unY
objet.Alors maintenant vous savez que déréférencer un
std::map
itérateur vous donne unstd::pair
, vous pouvez alors accéder à ses éléments avecfirst
etsecond
. Par exemple,(*it).first
vous donnera la clé et(*it).second
vous donnera la valeur. Ceux-ci sont équivalents àit->first
etit->second
.la source
operator[]
doit renvoyer un type spécifique maisfirst
etsecond
peut avoir différents types. D'autre part,std::tuple
a une fonction d'assistance spécialestd::get
pour accéder à ses éléments par index.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é estK
et la valeurV
eststd::pair<const K, V>
- la clé estconst
de vous éviter d'interférer avec le tri interne des valeurs de la carte.std::pair<>
a deux membres nommésfirst
etsecond
(voir ici ), avec une signification assez intuitive. Ainsi, étant donné un itérateuri
à une certaine carte, l'expression:Ce qui équivaut à:
Fait référence au premier
const
élément ( ) de l'pair
objet 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:Ce qui équivaut à:
Fait référence au deuxième élément de
pair
- c'est-à-dire à la valeur correspondante dans la carte.la source