Проблемы с qSort

У меня небольшая проблема с qSort. Я просто хочу отсортировать свой список после добавления вершины в свой QList m_acceptedVertices.

bool Vertex::greaterThan(Vertex * v1, Vertex *v2){

    return this->computeDistanceTo(v1) > this->computeDistanceTo(v2);
}

void Vertex::acceptVertex(Vertex* vert)
{

    m_acceptedVertices.append(vert);

    qSort(m_acceptedVertices.begin(), m_acceptedVertices.end(), greaterThan);

}

Но я все еще получаю эти ошибки:

Fehler: C3867: 'Vertex::greaterThan': в вызове функции отсутствует список аргументов; используйте '&Vertex::greaterThan', чтобы создать указатель на элемент

Fehler: C2780: 'void qSort (Container &)': ожидается 1 аргумент - предоставлено 3

Fehler: C2780: 'void qSort (RandomAccessIterator, RandomAccessIterator)': ожидает 2 › аргумента - предоставлено 3

Что я делаю не так? Кто-нибудь может мне помочь? Спасибо!


person user3879361    schedule 26.07.2014    source источник
comment
Вы пробовали то, что предлагает компилятор...?   -  person quantdev    schedule 26.07.2014
comment
Почему бы вам не использовать std::sort из стандартной библиотеки C++? Это может быть немного более эффективным (потому что создание экземпляра шаблона может быть встроено), и это, безусловно, более читабельно (более проверенный тип) и короче...   -  person Basile Starynkevitch    schedule 26.07.2014
comment
qsort или qsort? Эти вещи имеют значение!   -  person TonyK    schedule 26.07.2014
comment
greaterThan должен вернуть int, а не bool (по крайней мере, для qsort -- не знаю насчет qSort).   -  person TonyK    schedule 26.07.2014
comment
Вы не можете использовать функцию-член для qSort. Сделайте это свободной функцией/глобальной функцией или объявите ее статической. Другие варианты включают объект-функтор или с C++11 использование лямбда.   -  person ManuelH    schedule 26.07.2014
comment
я получаю эти ошибки с qSort. Я прочитал документацию Qt и сделал это, как в примере. но я все еще получаю эти ошибки   -  person user3879361    schedule 26.07.2014
comment
Кстати, computeDistanceTo, вероятно, немного дороже, и сортировка всей коллекции после каждой вставки может быть не лучшей идеей. Вы рассматривали std::set?   -  person Greg    schedule 26.07.2014
comment
Я предполагаю, что вы имеете в виду QT qSort; вы, вероятно, должны сказать это явно.   -  person Alan Stokes    schedule 26.07.2014


Ответы (2)


1) У вас есть проблема с дизайном, ваш компаратор должен быть свободной функцией (или функтором), сравнивающей 2 Vertex, ваша реализация, вероятно, должна выглядеть примерно так:

bool greaterThan(Vertex * v1, Vertex *v2){

    return v1.computeDistanceTo(v2) > 0;
}

2) Используйте стандартную библиотеку: std::sort (это скорее всего, в большинстве случаев выполняет внутреннюю быструю сортировку, но если вы действительно хотите использовать qSort тоже подойдет)


Минимальный рабочий пример со свободным компаратором функций:

class Vertex {
    public:
     int i;
};

bool greaterThan(Vertex * v1, Vertex *v2)
{
    return v1->i > v2->i;
}

int main()
{
    std::vector<Vertex*> v;
    v.push_back(new Vertex { 5 });
    v.push_back(new Vertex { 1 });
    v.push_back(new Vertex { 3 });
    v.push_back(new Vertex { 6 });
    v.push_back(new Vertex { 2 });

    std::sort(v.begin(), v.end(), &greaterThan);

    for(auto& ve : v)
       std::cout << ve->i << " ";
}

Примечание.

Для простых функций сравнения хорошей альтернативой являются лямбда-выражения:

std::sort(v.begin(), v.end(), [] (Vertex * v1, Vertex *v2) {return v1->i > v2->i;} );
person quantdev    schedule 26.07.2014

Если вы используете С++ 11, возможно, вам нужно что-то вроде этого:

void Vertex::acceptVertex(Vertex* vert)
{
    m_acceptedVertices.append(vert);

    qSort(hallo.begin(), hallo.end(), 
          [this](Vertex* v1, Vertex* v2) {
               return this->computeDistanceTo(v1) > this->computeDistanceTo(v2);
          });
}

Если вы используете более старый C++, вы должны определить объект функтора, который будет хранить ссылку на указатель Vertex, или использовать лямбда-выражение из boost.

person Marek R    schedule 26.07.2014