Frage

Ich arbeite an einem System, in dem ich in der Lage sein muss, einen Vektor nach einem bestimmten Prädikat zu sortieren, über das meine Klassen keine Kontrolle haben sollten. Grundsätzlich bestehe ich ihnen eine abgeleitete Klasse und sie sortieren blind darauf.

Als eines der "entzückenden Macken" ist eines der Art der Eintrittsreihenfolge. Folgendes habe ich so weit.

struct Strategy
{
   virtual bool operator()(const Loan& lhs, const Loan& rhs) const = 0;
};

struct strategyA : public Strategy
{
   bool operator()(const Loan& lhs, const Loan& rhs) const
   {
      return true;
   }
};

struct strategyB : public Strategy
{
   bool operator()(const Loan& lhs, const Loan& rhs) const
   {
      return lhs.getID() > rhs.getID();
   }
};

struct strategyC : public Strategy
{
   bool operator()(const Loan& lhs, const Loan& rhs) const
   {
      return lhs.getFee() > rhs.getFee();
   }
};

Da Strategya reflexiv ist, kann es natürlich nicht verwendet werden, und wenn ich es auf False setze, wird es alles als gleich behandeln und ich kann meine Daten verabschieden.

Also hier ist meine Frage. Gibt es eine Möglichkeit, eine Prädikatfunktion für die Sortierung eines Vektors zu definieren, der nichts ändert?

Ich bin mir bewusst, dass möglicherweise die einfachste Lösung darin besteht, der Kreditklasse eine Reihenfolge der Eintragsvariablen hinzuzufügen oder sie mit einem in einem Paar zu partnerieren. Alternativ könnte ich einen Parameter mit dem Prädikat einfügen, das dem Sortierer zeigt, ob er ihn verwenden oder nicht.

War es hilfreich?

Lösung

Persönlich denke ich, dass Ihre Strategieklasse eine "Sortier" -Methode haben sollte. Auf diese Weise kann es entweder Std :: sortieren oder nicht, wie es für richtig hält. Ob sowie wie wird es zu Teil der Sortierstrategie.

Die Antwort von Darios Stable_Sort ist sehr gut, wenn Sie sie verwenden können.

Es ist möglich, die Sortierung auf der Grundlage der Elementposition in einem Vektor durchzuführen, aber es bedeutet nicht, dass sich die Elemente nicht bewegen (viele Sortieralgorithmen werden im Grunde genommen Ihre Daten ausführen), sodass Sie eine zuverlässige Art der Bestimmung haben müssen Wo die Gegenstände waren, als Sie angefangen haben.

Es ist möglich, dass der Vergleich der Kartierung der aktuellen Position in die ursprüngliche Position geführt wird, aber viel Arbeit. Idealerweise muss die Logik in den Sortalgorithmus integriert werden - nicht nur in den Vergleich - und so funktioniert stabil_sort im Wesentlichen.

Ein weiteres Problem - abhängig vom Container - die Reihenfolge der (z. B.) Elementadressen ist nicht immer die Reihenfolge der Elemente.

Andere Tipps

Gibt es eine Möglichkeit, eine Prädikatfunktion für die Sortierung eines Vektors zu definieren, der nichts ändert?

Es hängt vom Algorithmus ab. Wenn Ihre Art ein ist stabile Sorte, Die Reihenfolge der "gleichen" Elemente wird nicht geändert (was für instabile Sorten undefiniert ist).

Erwägen Sie zu verwenden std::stable_sort.

Wenn es sich einfach um einen Vektor handelt, über den Sie sprechen, können Sie möglicherweise eine Schnittstelle bereitstellen, die feststellt, ob Sie sortieren sollten oder nicht. Vektoren sind kein bestelltes Container, daher müssen Sie sie explizit sortieren. Sortieren Sie sie einfach überhaupt nicht.

Es gibt keine Sortierfunktion, die die Reihenfolge der Elemente nur auf den Werten der Elemente basiert. Sie müssen weitere Informationen an Ihre bereitstellen Strategy, wenn es möglich ist.

Ein anderer Ansatz könnte darin bestehen, die Semantik Ihrer Daten in den Container zu bringen. Erwägen Sie, Boost :: Multi_index für verschiedene Zugriffs- und Bestellmöglichkeiten auf denselben Daten zu verwenden:

http://www.boost.org/doc/libs/1_42_0/libs/multi_index/doc/index.html

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top