Ich habe einen std::map
namens myMap
in meiner C++ - Anwendung und möchte ein Element mit myMap.find(key)
oder myMap[key]
erhalten. Ich möchte jedoch auch den Index dieses Elements in der Karte erhalten.
std::map<string, int> myMap;
// Populate myMap with a bunch of items...
myElement = myMap["myKey"];
// Now I need to get the index of myElement in myMap
Gibt es einen sauberen Weg, das zu tun?
Vielen Dank.
Ein std::map
hat nicht wirklich einen Index, sondern einen Iterator für ein Schlüssel/Wert-Paar. Dies ist einem Index ähnlich, da es eine Art Position in der Auflistung darstellt, aber nicht numerisch ist. Um den Iterator eines Schlüssel/Wert-Paares zu erhalten, verwenden Sie die find
-Methode
std::map<string, int>::iterator it = myMap.find("myKey");
Ich bin hergekommen, um nach dieser Antwort zu suchen, aber ich habe diese Distanz-Funktion gefunden
cout << distance(mymap.begin(),mymap.find("198765432"));
hoffe das hilft: D
Wenn Ihre Map bereits festgelegt ist (Sie würden danach keinen Schlüssel hinzufügen oder löschen) und Sie möchten einen Index daraus entfernen. Sie können Folgendes tun:
Erstellen Sie ein Array, in dem die Schlüssel Ihrer gesamten Karte gespeichert werden. Und da haben Sie es, Schlüssel per Index zugänglich!
vector<int> keys;
for (pair<K,V> entry : yourMap) {
keys.Push_back(entry.first);
}
Und das ist es. Um auf einen Index i
Ihrer Karte zuzugreifen, verwenden Sie yourMap[keys[i]]
.
Der Vorteil dieser Methode gegenüber der distance
-Funktion ist die zeitliche Komplexität. Es ist O(1)
garantiert.
Die Map behält den Schlüssel und die Daten als Paar bei Sie können den Schlüssel extrahieren, indem Sie den Iterator der Map in ein Paar oder direkt in das erste Element des Paars abbilden.
std::map<string, int> myMap;
std::map<string, int>::iterator it;
for(it=myMap.begin();it!=myMap.end();it++)
{
std::cout<<it->first<<std::endl;
}
Die Semantik einer Karte enthält keine Indizes. Um dies zu verstehen, können Sie beachten, dass Maps normalerweise als Bäume implementiert werden. Daher haben Elemente darin keinen Index (versuchen Sie, einen Index auf natürliche Weise für einen Baum zu definieren).
Map ist eine Schlüsselwertdatenstruktur, die intern Daten in einer Baumstruktur enthält. Es gibt eine O(n) - Lösung, die oben angegeben ist . "Distance (mymap.begin (), mymap.find (" 198765432 "))" "wird Ihnen nicht die richtige Antwort liefern . Für Ihre Anforderung Sie müssen eine eigene Datenstruktur mit Segmentbaumstruktur für O log (n) Wettbewerbsvorgänge erstellen.
Es gibt keinen Index in einer Karte. Karten werden nicht (zumindest nicht notwendigerweise; und sind in den meisten Implementierungen nicht enthalten) als eine Folge von "Paaren" gespeichert.
Unabhängig von der Implementierung modelliert std :: map jedoch keinen Container mit einem Index.
Je nachdem, worum Sie diese Frage stellen, kann der "Index" ein Iterator (wie von anderen vorgeschlagen) oder der Schlüssel selbst sein.
Es klingt jedoch komisch, dass Sie diese Frage gestellt haben. Wenn Sie uns etwas mehr Details mitteilen könnten, könnten wir Sie wahrscheinlich auf eine bessere Lösung Ihres Problems hinweisen.