Tenho certeza que você sabe que um std::vector<X>armazena um monte de Xobjetos, certo? Mas se você tem um std::map<X, Y>, o que ele realmente armazena é um monte de std::pair<const X, Y>s. É exatamente o que é um mapa - ele une as chaves e os valores associados.
Quando você itera sobre um std::map, você está iterando sobre todos esses std::pairs. Quando você desreferencia um desses iteradores, obtém um std::paircontendo a chave e seu valor associado.
std::map<std::string, int> m = /* fill it */;
auto it = m.begin();
Aqui, se você o fizer agora *it, receberá std::pairo primeiro elemento no mapa.
Agora, o tipo std::pairdá acesso a seus elementos através de dois membros: firste second. Portanto, se você tiver std::pair<X, Y>chamado p, p.firsté um Xobjeto e p.secondé um Yobjeto.
Portanto, agora você sabe que a desreferenciação de um std::mapiterador fornece a std::pair, então você pode acessar seus elementos com firste second. Por exemplo, (*it).firstvocê fornecerá a chave e (*it).secondo valor. Estes são equivalentes a it->firste it->second.
std::maparmazena uma chave e um valor .map::iterator.secondrefere-se ao valor .