Evgenii Legotckoi
07 квітня 2017 р. 13:22

Qt/C++ - Урок 062. Компаратор для сортування QList

Працюючи з простими типами можна використовувати стандартні засоби сортування. Якщо ж потрібно проводити сортування складних об'єктів, за безліччю параметрів, то потрібно написати спеціальний компаратор, який порівняти за необхідними параметрами.

Напишемо невеликий компаратор, який сортуватиме об'єкти класу QPointF . Правила сортування будуть прості. Насамперед сортування має проводитися за координатою X, і якщо координати X збігаються, то робимо сортування за координатою Y.

Тобто до сортування список може виглядати так:

  1. (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))

Після сортування список буде виглядати так:

  1. (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))

Компаратор

Напишемо компаратор як статичну функцію:

  1. // компаратор должен быть статической функцией,
  2. // иначе её нельзя будет передать её в качестве аргумента
  3. static bool compare(const QPointF& first, const QPointF& second)
  4. {
  5. if (first.x() < second.x())
  6. {
  7. return true;
  8. }
  9. else if (first.x() > second.x())
  10. {
  11. return false;
  12. }
  13. else
  14. {
  15. if (first.y() < second.y())
  16. {
  17. return true;
  18. }
  19. else
  20. {
  21. return false;
  22. }
  23. }
  24.  
  25. }

Використання компаратора

  1. // Создадим и заполним список
  2. QList<QPointF> pointsList;
  3. pointsList << QPointF(12.4, 15.4)
  4. << QPointF(14.1, 7.5)
  5. << QPointF(7.2, 5.2)
  6. << QPointF(4.2, 18.5)
  7. << QPointF(4.2, 1.2)
  8. << QPointF(-19.5, 12.4)
  9. << QPointF(1.1, 1.2);
  10.  
  11. // Проверим состав списка
  12. qDebug() << pointsList;
  13.  
  14. // Отсортируем
  15. std::sort(pointsList.begin(), pointsList.end(), compare);
  16.  
  17. // Проверим результат
  18. qDebug() << pointsList;

Результат буде аналогічний тому, що було наведено на початку.

Рекомендовані статті на цю тему

По статті запитували0питання

2

Вам це подобається? Поділіться в соціальних мережах!

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up