2013-03-16 16 views
104

W języku C++, jaki jest typ std::map<>::iterator?Co oznacza iterator-> drugi?

Wiemy, że obiekt it typu std::map<A,B>::iterator ma przeciążony operator -> która zwraca std::pair<A,B>* i że std::pair<> ma człon first i second.

Ale, do czego odpowiadają ci ci dwaj członkowie i dlaczego musimy uzyskać dostęp do wartości zapisanej na mapie jako it->second?

+10

"Std :: map" przechowuje * klucz * i * wartość *. "Mapowanie :: iterator.second" odnosi się do * wartości *. –

+0

@AlokSave: Dzięki. Twój komentarz uratował wielu czytelników od przeczytania dwóch odpowiedzi, które, ewidentnie, mogły zostać skrócone do długości tweeta. – displayName

Odpowiedz

163

Jestem pewien, że wiesz, że std::vector<X> przechowuje całą masę obiektów X, prawda? Ale jeśli masz std::map<X, Y>, to, co faktycznie przechowuje, to cała masa std::pair<const X, Y> s. Tak właśnie jest mapa - łączy w pary klucze i powiązane wartości.

Podczas wykonywania powtórzenia testu std::map następuje iterowanie po wszystkich tych std::pair s. Po usunięciu któregoś z tych iteratorów otrzymuje się std::pair zawierający klucz i powiązaną z nim wartość.

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

Tutaj, jeśli teraz zrobić *it, dostaniesz się std::pair dla pierwszego elementu na mapie.

Teraz typ std::pair daje dostęp do jego elementów przez dwóch członków: first i second. Więc jeśli masz std::pair<X, Y> o nazwie p, p.first jest obiektem o numerze X i p.second jest obiektem .

Więc teraz wiesz, że dereferencing się std::map iterator daje std::pair, można następnie uzyskać dostęp do jego elementów z first i second. Na przykład (*it).first poda ci klucz, a (*it).second poda ci wartość. Są to odpowiedniki it->first i it->second.

+2

Dlaczego po prostu nie używają [0] i [1] (dla "pierwszego" i "drugiego") jak wszystko inne w programowaniu? –

+13

@AdamCross Ponieważ 'operator []' musi zwrócić określony typ, ale 'first' i' second' mogą mieć różne typy. Z drugiej strony, 'std :: tuple' ma specjalną funkcję pomocniczą' std :: get', która uzyskuje dostęp do swoich elementów poprzez indeks. –

+1

Dziękujemy za odpowiedź. Teraz ma to sens. –

13

rodzaju elementów z std::map (który jest również typ wyrażenia uzyskanego przez dereferencji iterację tej mapie), którego kluczem jest K i wartości jest V jest std::pair<const K, V> - kluczem jest const uniemożliwić zakłócanie z wewnętrznym sortowaniem wartości mapy.

std::pair<> ma dwóch członków nazwanych first i second (patrz here), z dość intuicyjny sposób. Tak więc, biorąc pod uwagę iterator i do pewnego mapie wyrażenie:

i->first 

co jest równoważne:

(*i).first 

odnosi się do pierwszego (const) elementu obiektu pairwskazywanego przez iterator - czyli odnosi się do klucza na mapie. Zamiast tego, wyrażenie:

i->second 

co jest równoważne:

(*i).second 

Dotyczy drugim element pair - czyli do odpowiedniej wartości na mapie.