qSort () не работает с собственной функцией сравнения - PullRequest
0 голосов
/ 07 ноября 2018

Я хочу использовать 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());
}

и QStringList с 160 элементами с именем 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

Спасибо, ребята!

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Статическая функция

Функция-член должна быть static, если вы хотите использовать ее в качестве компаратора:

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

Анонимная функция (лямбда)

Другой способ (C ++ 11 и более поздние версии) - использовать лямбды:

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

Функция STL

Примечание: согласно документам , qSort устарело, и Qt рекомендует использовать вместо него std::sort.

0 голосов
/ 07 ноября 2018

Компаратор не может быть методом класса (для метода класса нужен объект, для которого он вызывается). Вы можете определить compareNames как статическую функцию в CStreamSetup классе:

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