C ++, Sortiere einen Vektor basierend auf einem anderen

8

Das beste Beispiel, das ich habe, ist, dass ich Namen basierend auf ihrem Score sortieren möchte.

%Vor%

Wenn ich also die Punktzahl nach {5, 14, 24, 45} sortiere, sollten die Namen auch nach ihrer Punktzahl sortiert werden.

    
Krillex 21.05.2016, 22:54
quelle

6 Antworten

6

Wie bereits in anderen Antworten vorgeschlagen: Die Kombination des Namens und der Punktzahl jedes einzelnen ist wahrscheinlich die einfachste Lösung.

Im Allgemeinen kann dies mit einer Operation erreicht werden, die manchmal als "zip" bezeichnet wird: Kombination von zwei Vektoren zu einem Vektor von Paaren - zusammen mit einem entsprechenden "unzip".

Im Allgemeinen wird dies wie folgt aussehen:

%Vor%     
Marco13 22.05.2016, 02:07
quelle
4

Am besten wäre es, eine Struktur zu haben, die die Namen mit ihren Werten kombiniert und einen Vektor hat.

%Vor%

Dann können Sie Ihren Vektor deklarieren:

%Vor%

Und das Sortieren ist einfach mit std::sort from <algorithm> :

%Vor%

Oder Sie können das Lambda ändern, wenn Sie in absteigender Reihenfolge sortieren möchten:

%Vor%     
DeiDei 21.05.2016 23:06
quelle
4

Wenn Sie die Daten nicht in einen Vektor von Paaren oder struct mit beiden zusammenführen können, können Sie einen Vektor von Iteratoren oder die Indizes von 0 bis size-1 erstellen. Sortieren Sie das dann mit einem benutzerdefinierten Vergleicher. Erstellen Sie schließlich einen neuen Vektor und füllen Sie ihn mit den Iteratoren oder Indizes.

%Vor%     
Yakk 21.05.2016 23:11
quelle
3

Eine Möglichkeit besteht darin, die Namen und Werte in einer einzelnen Datenstruktur wie zB std::vector<std::pair<std::string,int>> zu speichern und dann wie folgt zu sortieren:

%Vor%

Alternativ können Sie Speicher wie zB std::map oder std::multimap verwenden, wenn Sie wiederholte Schlüssel (d. h. wiederholte Namen) wünschen.

    
ArchbishopOfBanterbury 21.05.2016 23:06
quelle
1

Kann dies nicht über einen benutzerdefinierten Iteratortyp erfolgen?

BEARBEITEN:

Was ich in seiner einfachsten Form denke - ein Paar Vektoren basierend auf dem ersten zu sortieren - ist ein Iterator, dessen Funktionen wie Dereferenzierung, Subskribierung, Mitgliederzugriff und Gleichheits- und Ordnungsvergleiche die entsprechenden Funktionen aufrufen würden der erste Iterator, alle anderen Funktionen (Kopieren, Arithmetik, Tauschen, ...), die auf beide Iteratoren wirken.

%Vor%

Der Iterator könnte zu einem multi_iterator erweitert werden, um mit einem beliebigen Neuordnungsalgorithmus zu arbeiten und auf eine beliebige Anzahl von zusätzlichen Huckepack-Sequenzen zu zeigen.
Es könnte ein lustiges kleines Projekt sein. Oder vielleicht gibt es bereits etwas Ähnliches in Boost oder anderswo.

EDIT2:

Vergiss das obige.
Eric Nieblers Range-v3-Bibliothek hat einen view::zip -Wrapper, der "N-Bereiche gibt zurück ein neuer Bereich, in dem das Mth-Element das Ergebnis des Aufrufs von make_tuple für die M-ten Elemente aller N-Bereiche ist. "
Das Sortieren des Bereichs mit einem Prädikat auf das erste Element der Tupel könnte nur den Trick machen.

    
Garp 22.05.2016 04:43
quelle
0

So viele haben diese Frage gestellt, und niemand hat eine befriedigende Antwort gefunden. Hier ist ein std :: sort -Helfer, der es ermöglicht, zwei Vektoren gleichzeitig zu sortieren, wobei die Werte von nur einem Vektor berücksichtigt werden. Diese Lösung basiert auf einem benutzerdefinierten RadomIt (zufälliger Iterator) und arbeitet direkt mit den ursprünglichen Vektordaten, ohne temporäre Kopien, Strukturumordnung oder zusätzliche Indizes:

%Vor%

Dies ist ein Anwendungsbeispiel, das sowohl Names als auch Age basierend auf Age -Werten sortiert, wobei standard std :: sort verwendet wird :

%Vor%

sortiert nach:

%Vor%

Code getestet auf Visual Studio 2017 und GCC 5.4.0 .

    
cDc 22.09.2017 17:28
quelle

Tags und Links