Was ist eine gute Möglichkeit, * einen Vektor * vorübergehend * zu sortieren?

9

Ich habe einen std :: Vektor, den ich für bestimmte Operationen nach ausgewählten Algorithmen sortieren muss, aber den Rest der Zeit den ursprünglichen Zustand beibehalten soll (z. B. nach dem Zeitpunkt, zu dem sie eingegeben wurden).

Natürlich kann ich std :: copy verwenden, um einen temporären Vektor zu erstellen und das zu sortieren, aber ich frage mich, ob es einen besseren Weg gibt, möglicherweise durch Zeitstempel der eingegebenen Elemente.

Prost

    
deworde 22.02.2010, 17:27
quelle

5 Antworten

18

Sie könnten einen std :: -Vektor erstellen, der alle Indizes des ersten Vektors enthält. Sie können dann den Indexvektor nach Ihren Wünschen sortieren. Dies sollte schnell und vor allem bedeutet nicht, dass Sie den ersten Vektor kopieren müssen (was wahrscheinlich teurer ist!).

    
monoceres 22.02.2010, 17:33
quelle
4

Wenn Sie etwas Boost brauchen, können Sie die MultiIndex-Bibliothek verwenden. Siehe diese Antwort von mir wo Sie werden einen Beispielcode finden.

Grundsätzlich können Sie mehrere "Ansichten" der gleichen Daten mit jeweils unterschiedlicher Reihenfolge speichern. In Ihrem Fall können Sie eine "Sequenz" -Ansicht behalten, in der die Daten in der Reihenfolge der Einfügung sind (wie ein Vektor) und eine "sortierte" Ansicht, in der die Daten nach einem Kriterium sortiert sind (wie eine Karte) .

    
Manuel 22.02.2010 17:42
quelle
1

Jeder gegebene Vektor wird zu jeder Zeit auf höchstens eine Art sortiert.

Es gibt zwei Alternativen:

Kopieren Sie in einen temporären Vektor und sortieren Sie diesen nach Wunsch. Wenn der Vektor nicht sehr groß ist und Sie nur wenig Platz haben, ist dies mit ziemlicher Sicherheit der beste Weg. Selbst wenn Sie über die Leistung besorgt sind, werden die Kosten für das Erstellen einer Kopie geringer sein als die Kosten für das Sortieren, und wenn die Kosten für das Kopieren erheblich sind, wird die Sortierung viel langsamer sein als das Kopieren.

Alternativ könnten Sie einen Weg (den Zeitstempel, den Sie erwähnt haben) behalten, den Vektor in die ursprüngliche Reihenfolge zurückordnen zu können. Dies wird langsam sein, da Sie dies nur tun möchten, wenn der Vektor sehr groß ist. Wenn Sie jedoch keinen temporären Vektor erstellen können, ist dies die einzige Möglichkeit.

    
David Thornley 22.02.2010 17:33
quelle
0

Welches Element Sie auch sortieren, Sie können es in eine Struktur mit mehreren Sortierfeldern einfügen.

%Vor%

(oder fügen Sie die Sortierreihenfolgen der Basisstruktur selbst hinzu?)

Dann können Sie, wenn Sie möchten, die verschiedenen Sortierreihenfolgen berechnen und Ihre Liste neu sortieren, je nachdem, welche Sortierreihenfolge Sie benötigen.

    
quelle
0

Ich schlage vor, in jedem vector Smart Pointer zu den Originaldaten zu speichern. Mit std::vector können Sie verschiedene Sortiermethoden bereitstellen. Mit intelligenten Zeigern werden sie automatisch gelöscht, wenn alle Referenzen auf das Objekt entfernt wurden.

    
Thomas Matthews 22.02.2010 18:12
quelle

Tags und Links