Tenho certeza que você sabe que um std::vector<X>
armazena um monte de X
objetos, 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::pair
s. Quando você desreferencia um desses iteradores, obtém um std::pair
contendo 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::pair
o primeiro elemento no mapa.
Agora, o tipo std::pair
dá acesso a seus elementos através de dois membros: first
e second
. Portanto, se você tiver std::pair<X, Y>
chamado p
, p.first
é um X
objeto e p.second
é um Y
objeto.
Portanto, agora você sabe que a desreferenciação de um std::map
iterador fornece a std::pair
, então você pode acessar seus elementos com first
e second
. Por exemplo, (*it).first
você fornecerá a chave e (*it).second
o valor. Estes são equivalentes a it->first
e it->second
.
std::map
armazena uma chave e um valor .map::iterator.second
refere-se ao valor .