2016-03-28 11 views
0

Der Aufruf von Qsort aus QList scheint nicht zum Sortieren nach 2 Spalten zu funktionieren. Wenn dies der Fall ist, möchte ich QList ableiten und eine Quicksort-Methode hinzufügen, die eine "compare" -Funktion aufruft, um die Sortierreihenfolge zu bestimmen.Unterklasse QList für Quicksort

Da ich neu in Qt bin (hauptsächlich Delphi), habe ich Probleme, den Code zu implementieren. Ich hoffe, die nach dem „Konzept“ des Codes zum Ausdruck erforderlich:

//prototype 
#define TComp = int compare(pointer1, pointer2); 

int MyComp(p1, p2) 
{ 
    if  (p1.x < p2.x) return –1 
    else if (p1.x > p2.x) return 1 
    else if (p1.y < p2.y) return –1 
    else if (p1.y > p2.y) return 1 
    else     return 0 
} 

class TObjList : public QList 
{ 
public: 
    void mySort(MyComp); 
private: 
    void QuickSort(TComp MyComp); 
}; 

Dies ist ein großer fragen ist, aber ich brauche die Hilfe in diesem Stadium.

Antwort

1

Es gibt mehrere Dinge, hier würde ich nicht tun:

  1. Vererben ein Behältertyp wie QList macht keinen Sinn, da es keine virtuellen Methoden neu zu implementieren hat. Nur um eine Hilfsfunktion hinzuzufügen, rechtfertigt das Subclassing nicht, machen Sie es zu einer freien Funktion.
  2. Implementieren Sie das Sortieren als Elementfunktion anstelle einer generischen Funktion wie std :: sort.
  3. den ganzen Sortieralgorithmus reimplementieren nur Ihren eigenen Vergleichsoperator gewöhnungs

Ich würde vorschlagen, std :: sort und eine benutzerdefinierte Vergleichsfunktion (in C++ 11, das ein Lambda verwenden verwenden könnte oder std :: tuple, das lexikografischen Vergleich wie hier durchführt):

template <typename T> 
bool xyLessThan(const T &lhs, const T &rhs) 
{ 
    if (lhs.x == rhs.x) 
     return lhs.y < rhs.y; 
    return lhs.x < rhs.x; 
} 

Und dann z

QList<Point> points; 
... 
std::sort(points.begin(), points.end(), &xyLessThan); 

die einen generischen Sortieralgorithmus verwendet, die das können Sie die Funktion angeben, zum Vergleich herangezogen werden, die xyLessThan hier.

Wenn Sie steuern die Klasse der Elemente (die T in QList) und wenn es eine „natürliche“ Sortierung ist, können Sie eine operator< wie folgt hinzu:

bool Point::operator<(const Point &other) const 
{ 
    if (x == other.x) 
     return y < other.y; 
    return x < other.x; 
} 

dann können Sie nur tun

std::sort(points.begin(), points.end()); 
+0

Danke für eine interessante und engagierte Antwort. Ich werde einige Zeit brauchen, um den Inhalt zu konsumieren und auf Sie zurück zu wetten. Danke noch einmal. – Glen