Was ist in C ++ der Typ eines std::map<>::iterator
?
Wir wissen, dass ein Objekt it
vom Typ std::map<A,B>::iterator
eine Überladung hat, operator ->
die a zurückgibt std::pair<A,B>*
, und dass das std::pair<>
ein first
und ein second
Mitglied hat.
Aber was entsprechen diese beiden Mitglieder und warum müssen wir auf den in der Karte gespeicherten Wert zugreifen it->second
?
std::map
speichert einen Schlüssel und einen Wert .map::iterator.second
bezieht sich auf den Wert .Antworten:
Ich bin sicher, Sie wissen, dass ein
std::vector<X>
eine ganze Reihe vonX
Objekten speichert , oder? Aber wenn Sie eine habenstd::map<X, Y>
, speichert sie tatsächlich eine ganze Reihe vonstd::pair<const X, Y>
s. Genau das ist eine Karte - sie verbindet die Schlüssel und die zugehörigen Werte.Wenn Sie über a iterieren
std::map
, iterieren Sie über alle diesestd::pair
s. Wenn Sie einen dieser Iteratoren dereferenzieren, erhalten Sie einenstd::pair
, der den Schlüssel und den zugehörigen Wert enthält.Wenn Sie dies jetzt tun
*it
, erhalten Sie dasstd::pair
für das erste Element in der Karte.Jetzt
std::pair
gibt Ihnen der Typ über zwei Elemente Zugriff auf seine Elemente:first
undsecond
. Wenn Sie also einenstd::pair<X, Y>
Anruf habenp
,p.first
ist dies einX
Objekt undp.second
einY
Objekt.Jetzt wissen Sie also, dass Sie durch die Dereferenzierung eines
std::map
Iterators eine erhaltenstd::pair
. Anschließend können Sie mitfirst
und auf seine Elemente zugreifensecond
. Zum Beispiel(*it).first
werden Sie den Schlüssel geben und(*it).second
werden Sie den Wert geben. Diese sind äquivalent zuit->first
undit->second
.quelle
operator[]
muss aber einen bestimmten Typ zurückgebenfirst
undsecond
kann verschiedene Typen haben. Auf der anderen Seitestd::tuple
hat eine spezielle Hilfsfunktionstd::get
für den Zugriff auf seine Elemente per Index.Der Typ der Elemente eines
std::map
(der auch der Typ eines Ausdrucks ist, der durch Dereferenzieren eines Iterators dieser Karte erhalten wird), dessen SchlüsselK
und WertV
iststd::pair<const K, V>
- der Schlüssel sollconst
verhindern, dass Sie die interne Sortierung von Kartenwerten stören.std::pair<>
hat zwei Mitglieder mit dem Namenfirst
undsecond
(siehe hier ), mit einer ziemlich intuitiven Bedeutung. Bei einem Iteratori
für eine bestimmte Karte lautet der Ausdruck:Welches ist gleichbedeutend mit:
Bezieht sich auf das erste (
const
) Element despair
Objekts, auf das der Iterator zeigt - dh es bezieht sich auf einen Schlüssel in der Karte. Stattdessen lautet der Ausdruck:Welches ist gleichbedeutend mit:
Bezieht sich auf das zweite Element von
pair
- dh auf den entsprechenden Wert in der Karte.quelle