wake-up-neo.com

Rufen Sie den Index des Elements in der C++ - Map ab

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.

20
SZH

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");
8
JaredPar

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

48
Mahmoud Aladdin

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.

3
off99555

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;
}
1
user2614242

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).

0
Sylvain Lobry

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.

0
soul_departed

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.

0
Stefano Falasca