Я уверен, что вы знаете, что в std::vector<X>магазине хранится целая куча Xпредметов, верно? Но если у вас есть std::map<X, Y>, то, что он на самом деле хранит, это целая куча std::pair<const X, Y>с. Это именно то, что карта - она соединяет вместе ключи и связанные значения.
Когда вы итерируете по a std::map, вы повторяете по всем этим std::pairs. Когда вы разыменовываете один из этих итераторов, вы получаете std::pairключ, содержащий его значение.
std::map<std::string, int> m = /* fill it */;
auto it = m.begin();
Здесь, если вы сейчас это сделаете *it, вы получите std::pairпервый элемент на карте.
Теперь тип std::pairдает вам доступ к его элементам через два члена: firstи second. Так что если у вас есть std::pair<X, Y>вызываемый p, p.firstявляется Xобъектом и p.secondявляется Yобъектом.
Итак, теперь вы знаете, что разыменование std::mapитератора дает вам std::pair, тогда вы можете получить доступ к его элементам с помощью firstи second. Например, (*it).firstдаст вам ключ и (*it).secondдаст вам значение. Это эквивалентно it->firstи it->second.
std::mapхранит ключ и значение .map::iterator.secondотносится к стоимости .