qSort() 不适用于自己的比较函数

qSort() doesn't work with own compare function

我想使用qSort()如下。

我有一个名为

的比较函数
bool CStreamSetup::compareNames(const QString &s1, const QString &s2)
{
    QString temp1 = s1.section("Stream", 1);
    temp1 = temp1.section('_', 0, 0);

    QString temp2 = s2.section("Stream", 1);
    temp2 = temp2.section('_', 0, 0);

    return (temp1.toInt() < temp2.toInt());
}

和一个包含 160 个元素的 QStringList QStringList childKeys;

当我调用QSort函数时如下:

qSort(childKeys.begin(), childKeys.end(), compareNames);

出现以下错误。

'compareNames': non-standard syntax; use '&' to create a pointer to member
'qSort': no matching overloaded function found
'void qSort(Container &)': expects 1 arguments - 3 provided
'void qSort(RandomAccessIterator, RandomAccessIterator)' expects 2 arguments - 3 provided

谢谢大家!

Comparator 不能是 class 的方法(class 的方法需要调用它的对象)。您可以在 CStreamSetup class:

中将 compareNames 定义为静态函数
class CStreamSetup {
  static bool CStreamSetup::compareNames(const QString &s1, const QString &s2);
  // ^^^
}; 

compareNames的定义保持不变。

bool CStreamSetup::compareNames(const QString &s1, const QString &s2)
{
    QString temp1 = s1.section("Stream", 1);
    //...
}

或者您可以将比较器定义为自由函数:

bool compareNames(const QString &s1, const QString &s2)
{
    QString temp1 = s1.section("Stream", 1);
    //...
}

静态函数

成员函数需要是static如果你想用它作为比较器:

static bool compareNames(const QString &s1, const QString &s2);

匿名函数 (lambda)

另一种方法(C++11 及更高版本)是使用 lambda:

qSort(childKeys.begin(), childKeys.end(), [this](const QString &s1, const QString &s2) {
    return compareNames(s1, s2);
});

STL函数

旁注:根据 docsqSort 已过时,Qt 建议改用 std::sort