Zugreifen auf Kartenwert nach Index

7

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?

    
Sam 21.10.2011, 23:49
quelle

5 Antworten

19

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 .

    
K-ballo 21.10.2011, 23:54
quelle
3

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.

    
Michael Price 21.10.2011 23:56
quelle
2

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

Salvatore Previti 21.10.2011 23:54
quelle
2

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:

  1. Ordnen Sie das Objekt dem dynamischen Speicher zu.
  2. Speichern Sie den Zeiger zusammen mit dem Schlüssel in std::map .
  3. Speichern Sie den Zeiger in 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.

    
Thomas Matthews 22.10.2011 00:26
quelle
1

Sie können einige andere kartenähnliche Container verwenden.
halten Sie eine Größe Felder können binäre Suchbaum einfach zum zufälligen Zugriff machen.
Hier ist meine Implementierung ...
Std-Stil, Direktzugriffs-Iterator ...
Größe ausgeglichener Baum ...
Ссылка
und B + Baum ...
Ссылка

    
奏之章 15.10.2015 10:16
quelle

Tags und Links