Sortieren std::map mit Wert
Ich muss Sortieren eine std::map
nach Wert anstatt nach der Schlüssel. Gibt es eine einfache Möglichkeit, es zu tun?
Habe ich eine Lösung aus dem folgenden thread:
std::map Sortierung von Daten?
Gibt es eine bessere Lösung?
map<long, double> testMap;
//some code to generate the values in the map.
sort(testMap.begin(), testMap.end()); //is there any function like this to sort the map?
Warum brauchen Sie die anzeigen sortiert, dass Art und Weise? Sind Sie versuchen zu verbessern-lookup-Zeit, oder wollen Sie abarbeiten eine bestimmte Art und Weise?
Sie können die switch-Taste mit Wert.
Mögliche Duplikate von STL-Karte--> Sortieren nach Wert?
Sie können die switch-Taste mit Wert.
Mögliche Duplikate von STL-Karte--> Sortieren nach Wert?
InformationsquelleAutor user619237 | 2011-02-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Obwohl richtigen Antworten wurden bereits gepostet, ich dachte, ich würde hinzufügen, eine demo, wie Sie dies tun können sauber:
Generic Assoziative Quelle ist (erfordert C++11)
Wenn Sie eine Alternative zu
std::map
für die Quelle assoziativer container (wiestd::unordered_map
), könnten Sie code eine separate überlast -, aber am Ende der Aktion ist immer noch die gleiche, also eine generalisierte assoziative container mithilfe von variadic templates können verwendet werden für entweder - mapping-Konstruktion:Dieser Arbeit wird für beide
std::map
undstd::unordered_map
als Quelle der flip.+1 für die saubere Lösung. Allerdings wäre es besser, wenn die Ziel-Karte war eine multimap, um zu vermeiden, dass Kollisionen mit den gleichen "Wert" - Tasten.
Wenn mehrere Werte den gleichen Wert haben, diese Lösung funktioniert nicht, da der "umgekehrte" Karte kann nicht auf zwei Paare mit dem gleichen Schlüssel. Für den einzigartigen Wert in der original-map, diese Lösung funktioniert!
bearbeitet so das Ergebnis ist eine multimap, wie vorgeschlagen, durch theosem.
Nachtrag Hinzugefügt, um Unterstützung für generische assoziative container, anstatt einfach
std::map
. Nette Antwort, btw, Oliver.InformationsquelleAutor Oliver Charlesworth
Brauchte ich etwas ähnliches, aber die Umgedrehte Karte würde nicht funktionieren für mich. Ich Kopier einfach meine Karte (freq unten) in einen Vektor von Paaren, dann sortiert die Paare aber ich wollte.
Es ist Teil des lambda-Ausdrucks. en.cppreference.com/w/cpp/language/lambda
Dies ist eine wunderbare Antwort. Die sort-Funktion kann noch mehr modulare, indem Sie ein Function-Objekt mit den passenden operator() überladen für die gewünschte Art der Logik. Nice Verwendung von lambda-Logik wenn.
Ich bin mit diesem code, kompiliert er fein in gcc 4.9.x, aber nicht kompilieren auf 4.8.x - die Angabe
const
vor beiden Argumente der lambda-fixes. Könnte das ein gcc 4.8.x bug, oder haben Sie gcc 4.9.x mehr erlauben als die Norm verlangt?Gute Frage. Lambda-support wurde Hinzugefügt, in C++ 0x (jetzt 11). Wenn Sie fügen Sie die C++ 11 flag, sollte es funktionieren. stackoverflow.com/questions/16886591/how-do-i-enable-c11-in-gcc
InformationsquelleAutor NielW
Wenn Sie möchten, präsentieren die Werte in einer Karte in der Reihenfolge sortiert, dann kopieren Sie die Werte aus der Karte, Vektor -, und Sortieren Sie den Vektor.
wenn ich dies Tue. dann verliere ich den Zusammenhang zwischen dem Schlüssel und Werte. sagen, ich habe map<long, double> id2Score. es enthält alle für die id (wobei id die nicht 0..n, kann es sein, wie 1, 5, 13 etc) und Partitur. dann, wenn ich einen Vektor erstellen mit Partitur und Sortieren, dann werde ich die lose die Informationen, die der id zugeordnet ist, die Partitur.
user619237: nicht wirklich. Sortieren Sie den Vektor. Holen Sie sich die max-oder min-oder was auch immer Wert, den Sie benötigen. Dann interate durch die original-Karte und suchen Sie nach einer übereinstimmung für diesen Wert in die Werte der map("it->zweite" .)
es sei denn, es sind zwei oder mehr Werte gleich...
InformationsquelleAutor Bogatyr
Ich mag die Antwort von Oli (flipping eine Karte), aber scheint es ein problem: die container-map wird nicht zulassen, dass zwei Elemente mit dem gleichen Schlüssel.
Lösung ist, um die Sommerzeit, die Art multimap. Das andere ist-dump, src, in einen Vektor und Sortieren Sie den Vektor. Der ehemalige erfordert kleinere Modifikationen an Oli ' s Antwort, und letzteres kann umgesetzt werden mit STL-Kopie, die kurz und prägnant
InformationsquelleAutor cxwangyi
Kann man nicht Sortieren
std::map
auf diese Weise, weil Sie einen der Einträge in der Karte werden nach dem Schlüssel sortiert. Wenn Sie möchten, Sortieren Sie nach Wert, Sie müssen erstellen Sie eine neuestd::map
mit vertauscht Schlüssel und Werte.Denken Sie daran, dass die doppelten keys müssen eindeutig sein in
testMap2
oder verwenden Siestd::multimap
.InformationsquelleAutor Fox32
Bauen auf Oli ' s Lösung (https://stackoverflow.com/a/5056797/2472351) mit multimaps, können Sie ersetzen Sie die zwei template-Funktionen, die er verwendet mit den folgenden:
Hier ist ein Beispiel-Programm, das zeigt alle Schlüssel-Wert-Paare, das bewahrt wird nach der Durchführung der flip.
Ergebnis:
InformationsquelleAutor ericgrosse
Einen
std::map
sortiert nach der es Wert ist im wesentlichen einestd::set
. Die einfachste Möglichkeit ist, kopieren Sie alle Einträge in der Karte auf einen Satz (entnommen und angepasst aus hier)Einer Einschränkung: wenn die Karte enthält verschiedene keys mit dem gleichen Wert, werden Sie nicht eingefügt werden in den Satz und verloren gehen.
InformationsquelleAutor rubenvb
U können, sollten Sie mithilfe von boost::bimap könnten, gab Ihnen ein Gefühl, die Karte ist sortiert nach Schlüssel und Werte gleichzeitig (das ist nicht das, was wirklich passiert, obwohl)
InformationsquelleAutor
In der folgenden Beispiel-code, den ich schrieb eine einfache Möglichkeit zur Ausgabe top Wörter in einem word_map Karte, wo der Schlüssel ist eine Zeichenfolge (Wort) und Wert für unsigned int (Wort vorkommen).
Die Idee ist einfach, die aktuellen top-word und löschen Sie Sie von der Karte. Es ist nicht optimiert, aber es funktioniert gut, wenn die Karte ist nicht groß und wir müssen nur die Ausgabe der ersten N Wörter, anstelle der Sortierung der gesamten Karte.
InformationsquelleAutor Jim Huang
Umgedreht Struktur möglicherweise nicht mehr eine Karte, sondern eine multimap, also in der flip_map obigen Beispiel nicht alle Elemente von B wird zwangsläufig erscheinen in der resultierenden Datenstruktur.
InformationsquelleAutor Yuri Feldman
Andere Lösung wäre die Verwendung von std::make_move_iterator den Bau eines neuen vector (C++11 )
InformationsquelleAutor Yan Bussieres
In diesem Zusammenhang sollten wir konvertieren map, multimap. Ich denke, konvertieren Karte zu setzen ist nicht gut, da verlieren wir viele Informationen im Falle von gibt es viele doppelte Werte in der ursprünglichen Karte. Hier ist meine Lösung, die ich definiert, das weniger als Komparator, die Art von Wert (cmp-Funktion). Wir können die cmp-Funktion wie unsere Forderung.
InformationsquelleAutor Loc Tran