Wie kann ich Durchlaufen/Durchlaufen einer STL-map?
Wollen, durchqueren eine STL-map. Ich will nicht verwenden Sie Ihre Schlüssel. I don ' T care über die Bestellung, die ich einfach nur nach einem Weg, um Zugriff auf alle Elemente, die es enthält. Wie kann ich dies tun?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, können Sie Durchlaufen eine Standard-Bibliothek
map
. Dies ist die grundlegende Methode verwendet, um die traverse einmap
, und dient als Orientierungshilfe, um die traverse jedem Standard-Bibliothek Sammlung:C++03 ODER C++11:
Wenn Sie müssen, ändern Sie die Elemente:
iterator
eher alsconst_iterator
.Anstelle von kopieren der Werte aus dem iterator eine Referenz und ändern Sie die Werte durch, die.
für( MyMap::iterator it = my_map.begin(); it != my_map.end(); ++it )
{
int key = es->erste;
string& Wert = es->Sekunde;
if( Wert == "foo" )
value = "bar";
}
Dies ist, wie Sie in der Regel Durchlaufen die Standard-Bibliothek-Behälter mit der hand. Der große Unterschied ist, dass für eine
map
die Art der*it
ist einpair
eher als das element selbstC++11
Wenn Sie den Vorteil, dass der C++11-compiler (z.B., die Letzte GCC mit
--std=c++11
oder MSVC), dann haben Sie andere Optionen, wie gut.Ersten können Sie Gebrauch machen von der
auto
Schlüsselwort, um loszuwerden, alle die bösen Ausführlichkeit:Zweiten, können Sie beschäftigen auch Lambda-Ausdrücke. In Verbindung mit
decltype
könnte dies in sauberer code (allerdings mit Kompromissen):C++11 auch instroduces das Konzept des range-Basen
for
Schleife, die Sie möglicherweise erkennen, wie ähnlich in anderen Sprachen. Aber von einigen Compilern noch nicht voll unterstützt dies noch-vor allem, MSVC.auto & val
in Ihren range-basierte for-Anweisung. Wir werden erreichen, eine ordnungsgemäße Typ abgeleitet Sprache einige Tag...auto
ist OK. Meine Zweifelauto &
ist, dassauto
hat eine etwas frickelige Sache entspricht-template-argument-Abzug, so dass ich vielleicht etwas verpasst haben. Ich don ' T haben eine gute genug compiler zu testen, entweder.string& value = val.second;
Ich denke, jeder (Durchschnitts -) Nutzer die Manipulation der Wert würde erwarten, dass die interne Darstellung der Karte zu ändern.Als mit jeder STL-container, die
begin()
undend()
Methoden liefern Iteratoren, die Sie verwenden können, um die Iteration über die Karte. Die Dereferenzierung einer Karte iterator liefert einenstd::pair<const Key, Value>
.Können Sie die traverse STL-map in der gleichen Weise wie jede andere STL-container: die Verwendung von Iteratoren, z.B.
myMap.end()
außerhalb der Schleife ? Hebe-Invarianten ist eine gemeinsame Optimierung, aber ich Frage mich, ob es wird erkannt, ich vermute, es könnte mit der Umsetzung eingebettet, aber ich weiß nicht wissen. Gedanken ?myMap.end()
ist sicherlich eine triviale operation. Kaum Wert anheben, vor allem wenn man bedenkt, dass Durchlaufen eine Karte ist nicht sehr cache-freundlich Bedienung.i != myMap.end()
könnte nur ein Vergleich der gespeicherten Adresse ini
mitmyMap+offset
. Ich habe noch nicht zerlegt, jeden code zu überprüfen, wenn.C++17
Seit C++17 können Sie range-basierte for-Schleifen zusammen mit strukturierte Bindungen für die Iteration über eine Karte. Der resultierende code, z.B. für das drucken von allen Elementen der map, ist kurz und gut lesbar:
Ausgabe:
Code auf Coliru
Können Sie Durchlaufen, gekennzeichnet durch die Verwendung von auto-iterator.
Code-Snippet:
Mit
for
mitauto
für C++11 und über NutzungDas neuere format von
for
mitauto
wurde in C++11Geben Sie Funktionalität, wie einige höhere level-Sprachen wie python
Wo es bereits eine Implementierung einer solchen Art von iteration
P. S. : map-variable hält die Werte sortiert, so dass bei der Iteration erhalten Sie die Schlüssel in sortierter Reihenfolge