Ответ 1
Я уверен, вы знаете, что std::vector<X>
хранит целую кучу объектов X
, правильно? Но если у вас есть std::map<X, Y>
, то на самом деле он хранит целую кучу std::pair<const X, Y>
s. Именно то, что представляет собой карта, - это пары вместе с ключами и связанными с ними значениями.
Когда вы выполняете итерацию по std::map
, вы повторяете все эти std::pair
s. Когда вы разыгрываете один из этих итераторов, вы получаете 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
.