2016-03-28 47 views
0

從QList調用Qsort似乎不適用於在2列上排序。如果是這種情況,我想繼承QList並添加一個調用「比較」函數來確定排序順序的Quicksort方法。快速排序的子類QList

是Qt的新手(主要是Delphi)我在執行代碼時遇到了麻煩。 我希望下面的表達所需要的代碼的「概念」:

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

這是一個很大的要求,但我需要在這個階段的幫助。

回答

1

這裏有幾件事情我不會做:

  1. 子類象的QList容器類型沒有意義,因爲它沒有虛方法重新實現。僅僅添加一個輔助函數並不能證明子類的正確性,因此可以將它作爲一個自由函數。
  2. 實現排序作爲成員函數而不是通用函數,如std :: sort。
  3. 重新實現整個排序算法只是爲了讓自己的比較操作使用

我建議使用std ::排序和自定義比較函數(在C++ 11,這可能使用lambda或std :: tuple,它實現了象這樣完成的字典對比):

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

然後例如

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

使用一個通用的排序算法,讓你指定的函數用於比較,這是xyLessThan這裏。

如果你控制類的要素(T IN的QList)的,如果有一個「自然」排序,你可以添加一個operator<這樣的:

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

那麼你可以做

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

感謝您的一個有趣的和涉及的答案。我需要一段時間才能消費內容並向您反饋。再次感謝。 – Glen