Wie wähle ich zwischen map und unordered_map?
Angenommen, ich wollte die Karte Daten mit einem string als Schlüssel.
Welchen container sollte ich gewählt habe, map
oder unordered_map
? unordered_map
nimmt mehr Speicher, so nehmen wir an, Speicher ist nicht ein Problem, und das Problem ist die Geschwindigkeit.
unordered_map
sollte generell Durchschnittliche Komplexität von O(1) mit dem schlechtesten Fall von O(n).
In welchen Fällen würden Sie bekommen auf O(n)?
Wann ist ein map
bekommen mehr Zeit effizienter als unordered_map
? Kommt es vor, wenn n klein ist?
Vorausgesetzt, ich würde verwenden, STL unordered_map
mit der Standard-haser Vs. Karte. string ist der Schlüssel.
Wenn ich dabei bin, zur Iteration über die Elemente eher als Zugriff auf ein einzelnes element jeder Zeit, sollte ich lieber map
?
InformationsquelleAutor der Frage StackHeapCollision | 2012-12-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
In der Praxis, wenn der Speicher ist kein Problem,
unordered_map
ist immer schneller, wenn Sie möchten einzelne element zugreifen.Schlimmsten Fall ist die theoretische und gebunden, um einen einzigen hash-accounting für alle Elemente. Dies ist nicht von praktischer Relevanz. Die
unordered_map
langsamer wird, sobald Sie mindestens log N Elemente der Zugehörigkeit zu der gleichen hash. Dies ist auch nicht von praktischer Relevanz. In einigen speziellen Szenarien könnten Sie die Verwendung eines bestimmten Hash-Algorithmus, sorgt für eine gleichmäßige Verteilung. Für normale Zeichenfolgen, die nicht teilen ein bestimmtes Muster, das generische hash-Funktionen kommen mitunordered_map
sind genauso gut.Wenn Sie möchten, Durchlaufen die anzeigen (Verwendung von Iteratoren) in eine sortierte Mode, die Sie nicht verwenden können
unordered_map
. Im Gegenteil,map
erlaubt nicht nur das, sondern auch kann Sie mit dem nächsten element in einer map-basierend auf eine Annäherung des Schlüssels (siehelower_bound
undupper_bound
Methoden).InformationsquelleAutor der Antwort ypnos
InformationsquelleAutor der Antwort
Profil und dann entscheiden.
unordered_map
ist in der Regel schneller, aber es variiert je nach Fall.Wenn die Vermischung nicht gut ist und ein paar Elemente werden zugewiesen, um den gleichen Behälter.
Wahrscheinlich nicht, aber das Profil, wenn es dich wirklich kümmert. Nachdem Sie einen container mit einer kleinen Größe werden der Engpass des Programms erscheint äußerst unwahrscheinlich. Trotzdem, eine einfache
vector
mit linearer Suche eventuell schneller für solche Fälle.Das wichtigste bei der Entscheidung ist den Anforderungen der Bestellung und der Mangel der iterator ungültig machen. Wenn Sie brauchen, entweder, Sie ziemlich viel haben zu verwenden
map
. Ansonstenunordered_map
.InformationsquelleAutor der Antwort Pubby
wenn du so ein bad hash-Funktion erzeugt den gleichen hash-Wert für alle input-stirngs (d.h. produzieren Kollisionen)...
Es ist immer die Fragen, Anforderungen und die Art/Menge der Daten, die Sie haben.
Es ist nur eine andere Struktur. Du solltest besser machen eine chiose zu verwenden einer von Ihnen je auf Ihre typische Anwendungsfälle (takeing in Rechnung, welche Art von Daten haben Sie und Ihr Betrag)
Im Falle kleiner Datenmengen alles hängt davon ab, insbesondere die STL-Implementierung...
Also manchmal sogar einen einfachen Vektor/array schneller sein könnte als assoziative Container...
InformationsquelleAutor der Antwort zaufi