Wie kann ich Sortieren std::map zunächst von Wert, dann mit dem Schlüssel?
Muss ich Sortieren std::map
by-value, dann mit dem Schlüssel. Die Karte enthält Daten wie die folgenden:
1 realistically
8 really
4 reason
3 reasonable
1 reasonably
1 reassemble
1 reassembled
2 recognize
92 record
48 records
7 recs
Ich brauche, um die Werte in Ordnung, aber der Clou ist, dass die Tasten in alphabetischer Reihenfolge nach den Werten in Ordnung sind. Wie kann ich dies tun?
- verwenden Sie eine std::map, um die Daten zu speichern ?
- Setzen Sie die std::pair<int, std::string>s in eine Liste und Sortiere Sie.
- ja, die gespeichert sind in einer Karte.
- Ich weiß, dass die Werte in Ordnung, aber dann würde es halten Sie die Tasten in alphabetischer Reihenfolge nach Sortieren der Werte?
- Sortieren nach Paaren sortiert auf den ersten, dann den zweiten Punkt. Siehe here
- Wert nur stackoverflow.com/questions/2699060/stl-map-sort-by-value
- Sie können
std::multimap
mit Ihremvalues
alskeys
da Sie es ermöglicht, doppelte Schlüssel und arbeiten mitstd::sort
Du musst angemeldet sein, um einen Kommentar abzugeben.
std::map
Sortieren Ihre Elemente durchkeys
. Es kümmert sich nicht um dievalues
bei der Sortierung.Sie können
std::vector<std::pair<K,V>>
dann Sortieren Sie mitstd::sort
gefolgt vonstd::stable_sort
:Die erste Art verwenden sollte
std::sort
da esnlog(n)
, und verwenden Sie dannstd::stable_sort
dien(log(n))^2
im schlimmsten Fall.Beachten Sie, dass während
std::sort
gewählt wird, die performance für Grundstd::stable_sort
ist notwendig für die korrekte Bestellung, wie Sie wollen, dass die order-by-Wert, bewahrt zu werden.@gsf erwähnt in dem Kommentar, den Sie verwenden könnten nur
std::sort
wenn Sie einen comparer vergleichtvalues
ersten, und WENN Sie gleich sind, Sortieren Sie diekeys
.Sollte effizient sein.
Aber warten Sie, es gibt eine bessere Methode: store
std::pair<V,K>
stattstd::pair<K,V>
und dann brauchst du nicht comparer an alle — den standard-comparer forstd::pair
genug sein würde, wie es vergleichtfirst
(das istV
) zuerst, dannsecond
dieK
:Sollte große Arbeit.
key
odervalue
) sortiert ist, dann müssen Sie nurstable_sort
zu Sortieren, die andere, die ist nicht sortiert.there is a better approach: store std::pair<V,K> instead of std::pair<K,V> and then you don't need any comparer at all
würde sogar funktionieren, wenn Sie extrahieren möchten, einen Wert, basierend auf Schlüssel?std::multimap
Können Sie
std::set
stattstd::map
.Können Sie speichern beide Schlüssel und Wert in
std::pair
und die Art von container wird wie folgt Aussehen:std::set
Sortieren Sie die Werte sowohl von dem original-Schlüssel und Werte, die gespeichert wurden, instd::map
.Erläutert in Nawaz ist Antwort, Sie können nicht Sortieren Sie Ihre Karte, indem Sie sich, wie Sie es brauchen, weil
std::map
sortiert Elemente, basierend auf dem Schlüssel nur. So müssen Sie einen anderen container, aber wenn Sie zu bleiben, um Ihre anzeigen, dann können Sie immer noch kopieren Sie die Inhalte (vorübergehend) in eine andere Datenstruktur.Ich denke, die beste Lösung ist die Verwendung eines
std::set
Speicherung gekippt Schlüssel-Wert-Paaren, wie Sie in ks1322 ist Antwort.Die
std::set
ist sortiert und die Reihenfolge der Paare ist genau so, wie Sie es brauchen:Diese Weise brauchen Sie nicht eine zusätzliche Sortierung Schritt und der resultierende code ist sehr kurz:
Ausgabe:
Code auf Ideone
Hinweis: Da C++17 können Sie range-basierte for-Schleifen zusammen mit strukturierte Bindungen für die Iteration über eine Karte.
Als Ergebnis der code für das kopieren der Karte wird sogar noch kürzer und lesbarer:
std::map
bereits sortiert die Werte mit Hilfe eines Prädikats definieren oderstd::less
wenn Sie nicht bieten eine.std::set
wird auch speichern Sie Elemente in der Reihenfolge der von einer define-Komparator. Aber weder gesetzt noch anzeigen können Sie mehrere Schlüssel. Ich würde vorschlagen, die Definition einerstd::map<int,std::set<string>
wenn Sie möchten, dies zu erreichen, mit Ihren Daten Struktur allein. Sie sollten auch erkennen, dassstd::less
für die string-Sortierung lexikographisch geordnet (nicht alphabetisch).EDIT: Die anderen beiden Antworten machen Sie einen guten Punkt. Ich gehe davon aus, dass Sie möchten, um Sie in eine andere Struktur, oder, um zu drucken Sie Sie aus.
"Am besten" kann bedeuten, eine Reihe von verschiedenen Dingen. Meinst du mit "am einfachsten," "Schnellste", "die meisten effizient", "least-code", "die meisten gelesen?"
Der offensichtlichste Ansatz besteht darin, eine Schleife durch zweimal. Auf dem ersten pass, um die Werte:
Dann auf den zweiten Durchlauf, alphabetisch die Worte, aber nur, wenn Ihre Werte übereinstimmen.
Streng genommen ist das eine "bubble-sort", das ist langsam, weil jedes mal, wenn Sie einen swap, müssen Sie von vorne beginnen. Ein "Durchlauf" ist abgeschlossen, wenn Sie durch die gesamte Liste, die Sie ohne swaps.
Gibt es andere algorithmen zur Sortierung, aber das Prinzip wäre das gleiche: order by Wert, dann alphabetisch.