Wenn ich eine Struktur wie
habe %Vor%Wie kann ich auf myMap [0] zugreifen?
Ich weiß, dass die Map intern sortiert und mir damit auch nichts passiert, ich möchte einen Wert in der Map nach Index bekommen. Ich habe versucht, myMap [0], aber ich bekomme den Fehler:
%Vor%Ich weiß, dass ich so etwas tun könnte:
%Vor%Aber das ist sicherlich sehr ineffizient? Gibt es einen besseren Weg?
Ihr map
soll nicht auf diese Weise aufgerufen werden, es wird durch Schlüssel indiziert, nicht nach Positionen. Ein map
Iterator ist bidirektional, genau wie ein list
, also ist die Funktion, die Sie verwenden, nicht ineffizienter als der Zugriff auf eine list
nach Position. Ihre Funktion könnte mit Hilfe von std::advance( iter, index )
ab begin()
geschrieben werden. Wenn Sie einen zufälligen Zugriff nach Position wünschen, verwenden Sie vector
oder deque
.
Vorherige Antwort (siehe Kommentar): Wie wäre es mit nur myMap.begin();
Sie können eine Random-Access-Map implementieren, indem Sie einen Vektor-Backing-Store verwenden, der im Wesentlichen ein Vektor von Paaren ist. Sie verlieren natürlich zu diesem Zeitpunkt alle Vorteile der Standard-Bibliothekskarte.
Nun, eigentlich kannst du nicht. Die von Ihnen gefundene Methode ist sehr ineffizient, sie hat eine Rechenkomplexität von O (n) (n Operationen im schlimmsten Fall, wobei n die Anzahl der Elemente in einer Karte ist).
Der Zugriff auf ein Element in einem Vektor oder in einem Array hat die Komplexität O (1) im Vergleich (konstante Rechenkomplexität, eine einzige Operation).
Stellen Sie sich vor, dass map intern als rot-schwarzer Baum implementiert ist (oder avl tree, es hängt von der Implementierung ab) und jede Insert-, Delete- und Lookup-Operation ist O (log n) worst case (erfordert Logarithmus in Base 2-Operationen) finde ein Element im Baum), das ist ziemlich gut.
Sie können mit einer benutzerdefinierten Klasse arbeiten, die sowohl einen Vektor als auch eine Karte enthält.
Die Einfügung am Ende der Klasse wird gemittelt O (1), Nachschlagen nach Name ist O (log n), Nachschlagen nach Index ist O (1), aber in diesem Fall wird die Entfernungsoperation O (n).
Es kann eine implementierungsspezifische (nicht portable) Methode geben, um Ihr Ziel zu erreichen, aber keine, die tragbar ist.
Im Allgemeinen wird std::map
als eine Art Binärbaum implementiert, normalerweise nach Schlüssel sortiert. Die Definition des ersten Elements ist abhängig von der Reihenfolge. In Ihrer Definition ist das Element [0] der Knoten am Anfang der Struktur oder der linke Blattknoten?
Viele Binärbäume sind als verkettete Listen implementiert. Die meisten verknüpften Listen können nicht direkt wie ein Array aufgerufen werden, denn um Element 5 zu finden, müssen Sie den Links folgen. Dies ist per Definition.
Sie können Ihr Problem beheben, indem Sie sowohl std::vector
als auch std::map
verwenden:
std::map
. std::vector
an der gewünschten Position
bei. Das std::map
ermöglicht eine effiziente Methode, um auf das Objekt per Schlüssel zuzugreifen.
Die std::vector
ermöglicht eine effiziente Methode, um auf das Objekt per Index zuzugreifen.
Das Speichern von Zeigern ermöglicht nur eine Instanz des Objekts, anstatt mehrere Kopien verwalten zu müssen.