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%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>
:
Oder Sie können das Lambda ändern, wenn Sie in absteigender Reihenfolge sortieren möchten:
%Vor%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% 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:
Alternativ können Sie Speicher wie zB std::map
oder std::multimap
verwenden, wenn Sie wiederholte Schlüssel (d. h. wiederholte Namen) wünschen.
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.
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 .