W C ++, jaki jest typ a std::map<>::iterator
?
Wiemy, że obiekt it
typu std::map<A,B>::iterator
ma przeciążenie, operator ->
które zwraca a std::pair<A,B>*
, i że std::pair<>
ma first
isecond
.
Ale czemu odpowiadają te dwa elementy i dlaczego musimy uzyskać dostęp do wartości przechowywanej na mapie jako it->second
?
std::map
przechowuje klucz i wartość .map::iterator.second
odnosi się do wartości .Odpowiedzi:
Jestem pewien, że wiesz, że w jednym
std::vector<X>
sklepie znajduje się cała masaX
przedmiotów, prawda? Ale jeśli maszstd::map<X, Y>
, to, co faktycznie przechowuje, to cała masastd::pair<const X, Y>
plików. Dokładnie tym jest mapa - łączy w pary klucze i powiązane wartości.Kiedy wykonujesz iterację po a
std::map
, wykonujesz iterację po wszystkich tychstd::pair
. Kiedy wyłuskujesz jeden z tych iteratorów, otrzymaszstd::pair
zawierający klucz i skojarzoną z nim wartość.Tutaj, jeśli teraz to zrobisz
*it
, otrzymaszstd::pair
pierwszy element na mapie.Teraz typ
std::pair
zapewnia dostęp do swoich elementów za pośrednictwem dwóch elementów:first
isecond
. Więc jeśli maszstd::pair<X, Y>
wywołanep
,p.first
jestX
obiektem ip.second
jestY
obiektem.Więc teraz wiesz, że wyłuskiwanie
std::map
odwołań daje iteratorstd::pair
, możesz wtedy uzyskać dostęp do jego elementów za pomocąfirst
isecond
. Na przykład(*it).first
da ci klucz i(*it).second
poda wartość. Są one równoważneit->first
iit->second
.źródło
operator[]
musi wrócić typ specyficzny, alefirst
isecond
może mieć różne typy. Z drugiej stronystd::tuple
ma specjalną funkcję pomocnicząstd::get
umożliwiającą dostęp do jego elementów za pomocą indeksu.Typ elementów an
std::map
(który jest również typem wyrażenia uzyskanego przez dereferencję iteratora tej mapy), których kluczem jest,K
a wartośćV
tostd::pair<const K, V>
- kluczem jestconst
zapobieganie zakłócaniu wewnętrznego sortowania wartości mapy.std::pair<>
ma dwóch członków nazwanychfirst
isecond
(patrz tutaj ), o dość intuicyjnym znaczeniu. Tak więc, mając iteratori
do określonej mapy, wyrażenie:Co jest równoważne z:
Odnosi się do pierwszego (
const
) elementupair
obiektu wskazywanego przez iterator - tj. Odnosi się do klucza w mapie. Zamiast tego wyrażenie:Co jest równoważne z:
Odnosi się do drugiego elementu
pair
- tj. Do odpowiedniej wartości na mapie.źródło