В C ++, какой тип std::map<>::iterator
?
Мы знаем, что объект it
типа std::map<A,B>::iterator
имеет перегруженную версию, operator ->
которая возвращает a std::pair<A,B>*
, и что std::pair<>
элемент a имеет first
и second
.
Но чему соответствуют эти два члена и почему мы должны получить доступ к значению, хранящемуся на карте, как it->second
?
std::map
хранит ключ и значение .map::iterator.second
относится к стоимости .Ответы:
Я уверен, что вы знаете, что в
std::vector<X>
магазине хранится целая кучаX
предметов, верно? Но если у вас естьstd::map<X, Y>
, то, что он на самом деле хранит, это целая кучаstd::pair<const X, Y>
с. Это именно то, что карта - она соединяет вместе ключи и связанные значения.Когда вы итерируете по a
std::map
, вы повторяете по всем этимstd::pair
s. Когда вы разыменовываете один из этих итераторов, вы получаетеstd::pair
ключ, содержащий его значение.Здесь, если вы сейчас это сделаете
*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
.источник
operator[]
должен возвращать тип специфический , ноfirst
иsecond
могут иметь различные типы. С другой стороны,std::tuple
имеет специальную вспомогательную функциюstd::get
для доступа к своим элементам по индексу.Тип из элементов
std::map
(который является также типом выражения , полученного путем разыменования этой карты) , чей ключK
и значения являетсяV
этоstd::pair<const K, V>
- ключ ,const
чтобы предотвратить вас от вмешательства внутренней сортировки значений карты.std::pair<>
имеет два члена по имениfirst
иsecond
(см. здесь ), с довольно интуитивным значением. Таким образом, учитывая итераторi
для определенной карты, выражение:Что эквивалентно:
Относится к элементу first (
const
)pair
объекта, на который указывает итератор, т.е. к ключу на карте. Вместо этого выражение:Что эквивалентно:
Относится ко второму элементу
pair
- т.е. к соответствующему значению на карте.источник