2016-03-28 91 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