Sie müssen wissen, wie eine STL-Karte durchlaufen wird. Ich möchte den Schlüssel nicht verwenden. Ich interessiere mich nicht für die Bestellung, nur um auf alle darin enthaltenen Elemente zuzugreifen. Gibt es eine Möglichkeit, dies zu tun?
Ja, Sie können eine Standardbibliothek map
durchlaufen. Dies ist die grundlegende Methode, die zum Durchlaufen einer map
verwendet wird, und dient als Anleitung zum Durchlaufen einer Standardbibliotheksammlung:
#include <cstdlib>
#include <map>
#include <string>
using namespace std;
int main()
{
typedef map<int,string> MyMap;
MyMap my_map;
// ... magic
for( MyMap::const_iterator it = my_map.begin(); it != my_map.end(); ++it )
{
int key = it->first;
string value = it->second;
}
}
Wenn Sie die Elemente ändern müssen:
iterator
anstelle von const_iterator
.Anstatt die Werte aus dem Iterator zu kopieren, rufen Sie eine Referenz ab und ändern Sie die Werte dadurch.
for (MyMap :: iterator it = my_map.begin (); it! = my_map.end (); ++ it) { int key = it-> first; string & value = it-> second; if (value == "foo") value = "bar"; }
So durchlaufen Sie normalerweise Standard Library-Container von Hand. Der große Unterschied ist, dass für map
der Typ von *it
eine pair
ist und nicht das Element selbst
Wenn Sie den Vorteil eines C++ 11-Compilers haben (z. B. neueste GCC mit --std=c++11
oder MSVC), haben Sie auch andere Optionen.
Zunächst können Sie das auto
-Schlüsselwort verwenden, um diese böse Ausführlichkeit loszuwerden:
#include <cstdlib>
#include <map>
#include <string>
using namespace std;
int main()
{
map<int,string> my_map;
// ... magic
for( auto it = my_map.begin(); it != my_map.end(); ++it )
{
int key = it->first;
string& value = it->second;
}
}
Zweitens können Sie auch Lambdas einsetzen. In Verbindung mit decltype
kann dies zu saubererem Code führen (allerdings mit Kompromissen):
#include <cstdlib>
#include <map>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
map<int,string> my_map;
// ... magic
for_each(my_map.begin(), my_map.end(), [](decltype(*my_map.begin()) val)
{
string& value = val.second;
int key = val.first;
});
}
In C++ 11 ist auch das Konzept einer for
-Schleife für die Bereichsbasis enthalten, die Sie möglicherweise als ähnlich zu anderen Sprachen erkennen. Einige Compiler unterstützen dies jedoch noch nicht vollständig - insbesondere MSVC.
#include <cstdlib>
#include <map>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
map<int,string> my_map;
// ... magic
for(auto val : my_map )
{
string& value = val.second;
int key = val.first;
}
}
Wie bei jedem STL-Container geben die Methoden begin()
und end()
Iteratoren zurück, die Sie zum Durchlaufen der Map verwenden können. Die Dereferenzierung eines Karten-Iterators ergibt einen std::pair<const Key, Value>
.
Sie können STL map auf dieselbe Weise wie jeder andere STL-Container durchlaufen: Verwenden von Iteratoren, z.
for (std::map<key, value>::const_iterator
i = myMap.begin(), end = myMap.end(); i != end; ++i)
{
// *i is a key-value pair
}
Seit C++ 17 können Sie bereichsbezogen für Schleifen zusammen mit strukturierte Bindungen zum Durchlaufen einer Karte verwenden. Der resultierende Code, z.B. ist kurz und gut lesbar, um alle Elemente einer Karte zu drucken:
std::map<int, std::string> m{ {3, "a"}, {5, "b"}, {9, "c"} };
for (const auto &[k, v] : m)
std::cout << "m[" << k << "] = " << v << std::endl;
Ausgabe:
m [3] = a
m [5] = b
m [9] = c
Verwendung von for
mit auto
für C++ 11 und höher
map<int,int> map_variable; //you can use any data type for keys, as well as value
for(auto &x:map_variable)
{
cout<<x.first ;// gives the key
cout<<x.second; //gives the value
}
Das neuere Format von for
mit auto
wurde in C++ 11 eingeführt
Um ihm Funktionen zu geben, wie zum Beispiel Python
Dort gab es bereits eine Implementierung einer solchen Iteration
P.S. : map variable hält die Werte sortiert, so dass Sie beim Iterieren die Schlüssel in sortierter Reihenfolge erhalten
Sie können die Karte mithilfe des automatischen Iterators wiederholen.
#include<bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
map<string, int> mp;
mp["a"]=500;
mp["b"]=200;
mp["d"]=300;
mp["c"]=400;
for(auto it=mp.begin(); it != mp.end(); it++)
{
cout<<it->first <<" : "<<it->second<<endl;
}
return 0;
}