Что означает итератор-> второй?

В С++, какой тип std::map<>::iterator?

Мы знаем, что объект it типа std::map<A,B>::iterator имеет перегруженный operator ->, который возвращает std::pair<A,B>*, а std::pair<> имеет член first и second.

Но что соответствуют этим двум членам и почему нам нужно получить доступ к значению, хранящемуся на карте, как it->second?

Ответ 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.

Ответ 2

Тип элементов std::map (который также является типом выражения, полученного разыменованием итератора этой карты), ключ которого K, а значение V есть std::pair<const K, V> - ключ const, чтобы предотвратить вмешательство во внутреннюю сортировку значений карты.

std::pair<> имеет два члена с именем first и second (см. здесь), с довольно интуитивным значением. Таким образом, учитывая итератор i на определенное отображение, выражение:

i->first

Что эквивалентно:

(*i).first

Относится к первому (const) элементу объекта pair, на который указывает итератор, т.е. относится к ключу на карте. Вместо этого выражение:

i->second

Что эквивалентно:

(*i).second

Относится ко второму элементу pair - то есть к соответствующему значению на карте.