При работе с простыми типами можно использовать стандартные средства сортировки. Если же требуется производить сортировку сложных объектов, по множеству параметров, то требуется написать специальный компаратор, который будет производить сравнение по требуемым параметрам.
Напишем небольшой компаратор, который будет сортировать объекты класса QPointF . Правила сортировки будут простые. В первую очередь сортировка должна производиться по координате X, а если координаты X совпадают, то производим сортировку по координате Y.
То есть, до сортировки список может выглядеть так:
(QPointF(12.4,15.4), QPointF(14.1,7.5), QPointF(7.2,5.2), QPointF(4.2,18.5), QPointF(4.2,1.2), QPointF(-19.5,12.4), QPointF(1.1,1.2))
После сортировки список будет выглядеть так:
(QPointF(-19.5,12.4), QPointF(1.1,1.2), QPointF(4.2,1.2), QPointF(4.2,18.5), QPointF(7.2,5.2), QPointF(12.4,15.4), QPointF(14.1,7.5))
Компаратор
Напишем компаратор в качестве статической функции:
// компаратор должен быть статической функцией, // иначе её нельзя будет передать её в качестве аргумента static bool compare(const QPointF& first, const QPointF& second) { if (first.x() < second.x()) { return true; } else if (first.x() > second.x()) { return false; } else { if (first.y() < second.y()) { return true; } else { return false; } } }
Использование компаратора
// Создадим и заполним список QList<QPointF> pointsList; pointsList << QPointF(12.4, 15.4) << QPointF(14.1, 7.5) << QPointF(7.2, 5.2) << QPointF(4.2, 18.5) << QPointF(4.2, 1.2) << QPointF(-19.5, 12.4) << QPointF(1.1, 1.2); // Проверим состав списка qDebug() << pointsList; // Отсортируем std::sort(pointsList.begin(), pointsList.end(), compare); // Проверим результат qDebug() << pointsList;
Результат будет аналогичен тому, что был приведён в начале.