Estoy seguro de que sabes que un std::vector<X>almacena un montón de Xobjetos, ¿verdad? Pero si tienes un std::map<X, Y>, lo que realmente almacena es un montón de std::pair<const X, Y>s. Eso es exactamente lo que es un mapa: combina las claves y los valores asociados.
Cuando iteras sobre un std::map, estás iterando sobre todos estos std::pairs. Cuando desreferencia uno de estos iteradores, obtiene un que std::paircontiene la clave y su valor asociado.
std::map<std::string, int> m = /* fill it */;
auto it = m.begin();
Aquí, si ahora lo haces *it, obtendrás std::pairel primer elemento del mapa.
Ahora el tipo std::pairle da acceso a sus elementos a través de dos miembros: firsty second. Entonces, si tiene una std::pair<X, Y>llamada p, p.firstes un Xobjeto y p.secondes un Yobjeto.
Entonces, ahora que sabe que desreferenciar un std::mapiterador le da un std::pair, puede acceder a sus elementos con firsty second. Por ejemplo, (*it).firstle dará la clave y (*it).secondle dará el valor. Estos son equivalentes a it->firsty it->second.
std::mapalmacena una clave y un valor .map::iterator.secondse refiere a la valor .