Працюючи з простими типами можна використовувати стандартні засоби сортування. Якщо ж потрібно проводити сортування складних об'єктів, за безліччю параметрів, то потрібно написати спеціальний компаратор, який порівняти за необхідними параметрами.
Напишемо невеликий компаратор, який сортуватиме об'єкти класу 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;
Результат буде аналогічний тому, що було наведено на початку.