2010-02-23 13 views
5

Ich arbeite an einem System, wo ich in der Lage sein muss, einen Vektor nach einem gegebenen Prädikat zu sortieren, was meine Klassen nicht kontrollieren sollten. Im Grunde gebe ich ihnen eine abgeleitete Klasse und sie sortieren blind danach.Wie kann ich eine "Do-Nothing" -Sortierung definieren?

Als eine der "reizvollen Macken" ist eines der Sortiermuster die Reihenfolge des Eintritts. Hier ist, was ich bisher habe.

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(); 
    } 
}; 

Offensichtlich als strategyA reflexiv ist, kann sie nicht verwendet werden, und wenn ich es auf false gesetzt, es wird alles als gleich behandeln, und ich kann meine Daten zum Abschied küssen.

Also hier ist meine Frage. Gibt es eine Möglichkeit, eine Prädikatfunktion zum Sortieren eines Vektors zu definieren, die KEINESTS ändert?

Ich bin mir bewusst, dass die einfachste Lösung ist, eine Reihenfolge der Eintragsvariable zu der Loan-Klasse hinzufügen, oder Partner mit einer in einem Paar. Alternativ könnte ich einen Parameter mit dem Prädikat angeben, das dem Sortierer sagt, ob er es verwenden soll oder nicht.

Antwort

2

Ich persönlich denke, Ihre Strategie Klasse eine „Art“ Methode haben sollte. Auf diese Weise kann es entweder std :: sort aufrufen oder nicht, wie es ihm passt. Ob und wie Teil der Sortierstrategie wird.

Darios stable_sort Antwort ist sehr gut, wenn Sie es verwenden können.

Es ist möglich, Sortierung basierend auf Artikelposition in einem Vektor zu tun, aber es bedeutet nicht, dass Elemente sich nicht bewegen (viele Sortieralgorithmen werden im Grunde Ihre Daten verwürfeln-dann-resort), so dass Sie einige haben müssen zuverlässige Art und Weise zu bestimmen, wo die Elemente waren, als Sie begonnen haben.

Es ist möglich für den Vergleich eine Zuordnung der aktuellen Position zur ursprünglichen Position zu behalten, aber eine Menge Arbeit. Idealerweise muss die Logik in den Sortieralgorithmus integriert werden - nicht nur der Vergleich - und im Wesentlichen funktioniert stable_sort.

Ein weiteres Problem - je nach Container - ist die Reihenfolge der (etwa) Artikeladressen nicht immer die Reihenfolge der Artikel.

1

Wenn es sich einfach um einen Vektor handelt, über den Sie sprechen, können Sie vielleicht mit der Bereitstellung einer Schnittstelle fertig werden, die bestimmt, ob Sie sortieren sollen oder nicht. Vektoren sind kein geordneter Container, daher müssen Sie sie explizit sortieren. Sortiere sie einfach nicht.

7

Gibt es eine Möglichkeit, eine Prädikatfunktion zum Sortieren eines Vektors zu definieren, die KEINESTS ändert?

Es hängt vom Algorithmus ab. Wenn Ihre Sortierung stable sort ist, wird die Reihenfolge der "gleichen" Elemente nicht geändert (was für instabile Sortierungen nicht definiert ist).

Verwenden Sie std::stable_sort.

+0

Die "Strategie" sollte nicht von der Art der Implementierungsdetails abhängen. Man kann sich nicht auf "Strategie" verlassen, dass es mit einem stabilen Sortieralgorithmus verwendet wird. – Vlad

+0

@Vlad: Sag mir nicht;) – Dario

+0

nun, mein Kommentar war auf Topicstarter gerichtet. ;) – Vlad

1

Es gibt keine Sortierfunktion, die die Reihenfolge der Elemente basierend auf den Werten der Elemente beibehalten würde. Sie müssen mehr Informationen zu Ihrem Strategy zur Verfügung stellen, wenn es möglich ist.