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.
std::mapstocke une clé et une valeur .map::iterator.secondfait référence à la valeur .