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