Co oznacza iterator-> drugi?

157

W C ++, jaki jest typ a std::map<>::iterator?

Wiemy, że obiekt ittypu std::map<A,B>::iteratorma przeciążenie, operator ->które zwraca a std::pair<A,B>*, i że std::pair<>ma firstisecond .

Ale czemu odpowiadają te dwa elementy i dlaczego musimy uzyskać dostęp do wartości przechowywanej na mapie jako it->second?

Noich
źródło
14
A std::mapprzechowuje klucz i wartość . map::iterator.secondodnosi się do wartości .
Alok Save

Odpowiedzi:

247

Jestem pewien, że wiesz, że w jednym std::vector<X>sklepie znajduje się cała masa Xprzedmiotów, prawda? Ale jeśli masz std::map<X, Y>, to, co faktycznie przechowuje, to cała masa std::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 tych std::pair. Kiedy wyłuskujesz jeden z tych iteratorów, otrzymasz std::pairzawierający klucz i skojarzoną z nim wartość.

std::map<std::string, int> m = /* fill it */;
auto it = m.begin();

Tutaj, jeśli teraz to zrobisz *it, otrzymasz std::pairpierwszy element na mapie.

Teraz typ std::pairzapewnia dostęp do swoich elementów za pośrednictwem dwóch elementów: firsti second. Więc jeśli masz std::pair<X, Y>wywołane p, p.firstjest Xobiektem i p.secondjest Yobiektem.

Więc teraz wiesz, że wyłuskiwanie std::mapodwołań daje iterator std::pair, możesz wtedy uzyskać dostęp do jego elementów za pomocą firsti second. Na przykład (*it).firstda ci klucz i (*it).secondpoda wartość. Są one równoważne it->firsti it->second.

Joseph Mansfield
źródło
4
Dlaczego po prostu nie używają [0] i [1] (dla „pierwszego” i „drugiego”) jak wszystkiego innego w programowaniu?
21
@AdamCross Ponieważ operator[]musi wrócić typ specyficzny, ale firsti secondmoże mieć różne typy. Z drugiej strony std::tuplema specjalną funkcję pomocniczą std::getumożliwiającą dostęp do jego elementów za pomocą indeksu.
Joseph Mansfield
16

Typ elementów an std::map(który jest również typem wyrażenia uzyskanego przez dereferencję iteratora tej mapy), których kluczem jest, Ka wartość Vto std::pair<const K, V>- kluczem jest constzapobieganie zakłócaniu wewnętrznego sortowania wartości mapy.

std::pair<>ma dwóch członków nazwanych firsti second(patrz tutaj ), o dość intuicyjnym znaczeniu. Tak więc, mając iterator ido określonej mapy, wyrażenie:

i->first

Co jest równoważne z:

(*i).first

Odnosi się do pierwszego ( const) elementu pairobiektu wskazywanego przez iterator - tj. Odnosi się do klucza w mapie. Zamiast tego wyrażenie:

i->second

Co jest równoważne z:

(*i).second

Odnosi się do drugiego elementu pair- tj. Do odpowiedniej wartości na mapie.

Andy Prowl
źródło
5
Słowa „klucz” i „wartość” byłyby bardziej intuicyjne niż „pierwszy” i „drugi”, które oznaczają uporządkowanie.
ahoffer