Sortieren std::unordered_map, die durch Schlüssel
Wie kann ich eine Art unordered_map
durch Schlüssel? Ich brauche den Druck eines unordered_map
sortiert nach dem key.
InformationsquelleAutor devnull | 2011-06-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
std::unordered_map<int, unsigned long> *myunorderedmap;
Aberstd::map<int, unsigned long> ordered(myunorderedmap->begin, myunorderedmap->end);
Fehler gibtbegin und end sind Funktionen. Verwenden
ordered(myunorderedmap->begin(), myunorderedmap->end())
anstelle von, was Sie verwendet und alles wird in Ordnung sein.oops, habe ich es verpasst!
Und vergessen Sie nicht, wenn Sie kümmern sich nicht um die Erhaltung der Elemente der ursprünglichen container
make_move_iterator
benutzt werden können, um die Elemente in die neuen container:std::map<int, int> ordered(std::make_move_iterator(unordered.begin()), std::make_move_iterator(unordered.end()));
InformationsquelleAutor ronag
Eine Alternative Lösung ist, um zu konstruieren, ein Vektor, der die Schlüssel Sortieren Sie den Vektor-und print pro, sortiert Vektor. Dies wird deutlich schneller ist als die Ansätze, die konstruiert eine Karte von der Karte bestellt, sondern auch um mehr code.
std::sort
statt einer Liste.Und sogar geringfügig schneller noch, wenn Sie behalten, dass der Vektor mit der gewünschten Länge (wenn Sie verwenden müssen push_back)
InformationsquelleAutor David Hammen
Sind Sie sicher brauchen Sie diese? Denn das ist nicht möglich. Ein
unordered_map
ist ein hash-container, das heißt, die Tasten sind Hash -. Im inneren des Containers, Sie haben nicht die gleiche Darstellung wie auf der Außenseite. Schon der name impliziert, dass Sie können nicht sortiert werden. Es ist eines der Kriterien wählen, um einen hash-container: Sie tun nicht müssen eine bestimmte Reihenfolge.Wenn Sie nicht erhalten, eine normale
map
. Die Schlüssel werden automatisch sortiert, in eine strenge schwache bestellen. Wenn Sie brauchen eine andere Art, schreiben Sie Ihre eigenen Komparator.Wenn Sie nur brauchen, um es zu drucken sortiert, die folgenden kann ineffizient sein, aber es ist so nah wie erhalten Sie, wenn Sie immer noch wollen, zu halten, die
unordered_map
.Beispiel auf Ideone.
Beachten Sie, dass in C++0x, können Sie ersetzen Sie die zwei überladungen einer Funktion mit einem Standard-template-argument:
std::ostream_iterator
undstd::copy
statt eigenestreamer
thingie.Ah, stimmt, ich wusste da war etwas.
Auf einen zweiten Gedanken, Nein, weil
std::for_each
wird mir einestd::pair<K,V>
und ich müsste die Spaltung, die sowieso. Meine erste Umsetzung hat nicht funktioniert, deshalbstd::pair
können nicht gestreamt werden.InformationsquelleAutor Xeo
Ähnlich zu Davids Antwort, wir können
std::set
zu Sortieren, die wichtigsten zuerst:InformationsquelleAutor AhLeung
Können Sie Vektor zum speichern von Schlüssel-Wert-Paare, Sortieren Sie dann in Vektor -, setzen Sie diese wieder auf der Karte bei last.
Kompilieren mit folgenden Befehlen.
Ist das Ergebnis:
InformationsquelleAutor Jiancong