Quicksort的子类QList

时间:2016-03-28 00:38:59

标签: qt quicksort qlist

从QList调用Qsort似乎不适用于对2列进行排序。如果是这种情况,我想继承QList并添加一个调用“比较”函数的Quicksort方法来确定排序顺序。

刚接触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 个答案:

答案 0 :(得分:1)

我有几件事我不会这样做:

  1. 对像QList这样的容器类型进行子类化没有意义,因为它没有重新实现的虚拟方法。只是添加辅助函数并不能证明子类的合理性,使其成为一个自由函数。
  2. 将排序实现为成员函数,而不是像std :: sort这样的泛型函数。
  3. 重新实现整个排序算法只是为了使用你自己的比较运算符
  4. 我建议使用std :: sort和自定义比较函数(在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

    如果您控制元素的类(QList中的T)并且是否有“自然”排序,您可以像这样添加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());