Was bedeutet Iterator-> Sekunde?


157

Was ist in C ++ der Typ eines std::map<>::iterator?

Wir wissen, dass ein Objekt itvom Typ std::map<A,B>::iteratoreine Überladung hat, operator ->die a zurückgibt std::pair<A,B>*, und dass das std::pair<>ein firstund ein secondMitglied hat.

Aber was entsprechen diese beiden Mitglieder und warum müssen wir auf den in der Karte gespeicherten Wert zugreifen it->second?


14
A std::mapspeichert einen Schlüssel und einen Wert . map::iterator.secondbezieht sich auf den Wert .
Alok Save

Antworten:


247

Ich bin sicher, Sie wissen, dass ein std::vector<X>eine ganze Reihe von XObjekten speichert , oder? Aber wenn Sie eine haben std::map<X, Y>, speichert sie tatsächlich eine ganze Reihe von std::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 diese std::pairs. Wenn Sie einen dieser Iteratoren dereferenzieren, erhalten Sie einen std::pair, der den Schlüssel und den zugehörigen Wert enthält.

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

Wenn Sie dies jetzt tun *it, erhalten Sie das std::pairfür das erste Element in der Karte.

Jetzt std::pairgibt Ihnen der Typ über zwei Elemente Zugriff auf seine Elemente: firstund second. Wenn Sie also einen std::pair<X, Y>Anruf haben p, p.firstist dies ein XObjekt und p.secondein YObjekt.

Jetzt wissen Sie also, dass Sie durch die Dereferenzierung eines std::mapIterators eine erhalten std::pair. Anschließend können Sie mit firstund auf seine Elemente zugreifensecond . Zum Beispiel (*it).firstwerden Sie den Schlüssel geben und (*it).secondwerden Sie den Wert geben. Diese sind äquivalent zu it->firstund it->second.


4
Warum verwenden sie nicht einfach [0] und [1] (für "erste" und "zweite") wie alles andere in der Programmierung?

21
@AdamCross Da operator[]muss aber einen bestimmten Typ zurückgeben firstund secondkann verschiedene Typen haben. Auf der anderen Seite std::tuplehat eine spezielle Hilfsfunktion std::getfür den Zugriff auf seine Elemente per Index.
Joseph Mansfield

16

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üssel Kund Wert Vist std::pair<const K, V>- der Schlüssel soll constverhindern, dass Sie die interne Sortierung von Kartenwerten stören.

std::pair<>hat zwei Mitglieder mit dem Namen firstund second(siehe hier ), mit einer ziemlich intuitiven Bedeutung. Bei einem Iterator ifür eine bestimmte Karte lautet der Ausdruck:

i->first

Welches ist gleichbedeutend mit:

(*i).first

Bezieht sich auf das erste ( const) Element des pairObjekts, auf das der Iterator zeigt - dh es bezieht sich auf einen Schlüssel in der Karte. Stattdessen lautet der Ausdruck:

i->second

Welches ist gleichbedeutend mit:

(*i).second

Bezieht sich auf das zweite Element von pair- dh auf den entsprechenden Wert in der Karte.


5
Die Wörter "Schlüssel" und "Wert" wären intuitiver gewesen als "erste" und "zweite", was eine Reihenfolge impliziert.
Ahoffer
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.