Ich weiß, wie man einen Vektor von Paaren sortiert, aber wie sortiert man ein Paar von Vektoren ? Ich kann mir vorstellen, einen benutzerdefinierten "virtuellen" Iterator über ein Paar Vektoren zu schreiben und das zu sortieren, aber das scheint ziemlich komplex zu sein. Gibt es einen leichteren Weg? Gibt es einen in C ++ 03? Ich möchte std::sort
verwenden.
Dieses Problem tritt auf, wenn einige in der Hardware erzeugte Daten verarbeitet werden, wobei ein Paar von Arrays mehr Sinn ergibt als ein Array von Paaren (da dann alle Arten von Schritt- und Ausrichtungsproblemen auftreten würden). Ich stelle fest, dass sonst ein Paar Vektor anstelle eines Vektors von Paaren ein Konstruktionsfehler (die Struktur von Arrays -Problem) wäre. Ich bin auf der Suche nach einer schnellen Lösung, Kopieren der Daten in einen Vektor von Paaren und dann zurück (ich werde es an die HW zurückgeben, um mehr Verarbeitung zu tun) ist keine Option.
Beispiel:
%Vor%und nach dem Sortieren (nach dem ersten Vektor):
%Vor% Ich beziehe mich auf ein "Paar Vektoren" als das Paar keys
und values
(gespeichert als z.B. std::pair<std::vector<size_t>, std::vector<double> >
). Die Vektoren haben die gleiche Länge.
Lassen Sie uns einen Sortier / Permutations-Iterator machen, so dass wir einfach sagen können:
%Vor%Sehen Sie Live On Coliru und drucken
%Vor%Basierend auf der Idee hier habe ich Folgendes implementiert:
%Vor%Jetzt ist die Fabrikfunktion einfach:
%Vor% Hinweis Ich war ein wenig faul, indem ich boost/tuples/tuple_comparison.hpp
für die Sortierung verwendete. Dieses könnte zu Problemen bei der stabilen Sortierung führen, wenn mehrere Schlüsselwerte denselben Wert haben. In diesem Fall ist es jedoch schwierig zu definieren, was "stabil" ist, daher dachte ich, dass es für jetzt nicht wichtig ist.
Live auf Coliru %Vor%
Zum Vergleich: So viel Code benötigt der Split-Iterator-Ansatz:
%Vor% Es ist irgendwie schwierig, die Vergleiche zu überfrachten, aber die Menge an Unterschieden, die benötigt wird, um verschiedene Implementierungen von std::sort
zu unterstützen, lässt mich denken, dass die hashische Lösung tatsächlich portabler ist. Aber die Sortierung ist viel schöner:
Und natürlich gibt es das richtige Ergebnis .
Inspiriert von einem Kommentar von Mark Ransom, ist dies ein schrecklicher Hack und ein Beispiel dafür, wie man es nicht tut. Ich habe es nur zur Unterhaltung geschrieben und weil ich mich gefragt habe, wie kompliziert es wird. Dies ist keine Antwort auf meine Frage, ich werde das nicht benutzen. Ich wollte nur eine bizarre Idee teilen. Bitte, nicht ablehnen.
Wenn ich Multithreading ignoriere, glaube ich, dass das möglich ist:
%Vor%Und sortieren als:
%Vor%Das ist offensichtlich sehr entsetzlich, trivial, um auf schreckliche Weise zu missbrauchen, aber wohl viel kürzer als das Paar von Iteratoren und wahrscheinlich ähnlich in der Leistung. Und es funktioniert tatsächlich .
Beachten Sie, dass swap()
in ValueVectorSingleton
implementiert werden könnte und die im std
Namespace angegebene Variable nur aufrufen würde. Das würde es vermeiden, vv
und kv
public zu machen. Außerdem können die Adressen von a
und b
überprüft werden, um sicherzustellen, dass sie sich in kv
und nicht in einem anderen Vektor befinden. Dies ist auch auf das Sortieren nach Werten von nur einem Vektor beschränkt (kann nicht durch entsprechende Werte in beiden Vektoren zur selben Zeit sortiert werden). Und die Template-Parameter könnten einfach KeyType
und ValueType
sein, das wurde in Eile geschrieben.
Hier ist eine Lösung, die ich einmal verwendet habe, um ein Array zusammen mit einem Array von Indizes zu sortieren (- kann es von irgendwo hier sein?):
%Vor%Verwendung:
%Vor% Danach werden die Ganzzahlen im Vektor indices
so permutiert, dass sie steigenden Werten im Vektor values
entsprechen. Es ist einfach, dies von weniger Vergleichen zu allgemeinen Vergleichsfunktionen zu erweitern.
Als nächstes, um auch die Werte zu sortieren, können Sie ein anderes tun
%Vor%mit der gleichen Vergleichsfunktion. Dies ist die Lösung für die Faulen. Natürlich können Sie alternativ auch die sortierten Indizes nach
verwenden %Vor%BEARBEITEN: Ich habe gerade festgestellt, dass das oben genannte in die entgegengesetzte Richtung geht als das, nach dem Sie gefragt haben.