Evgenii Legotckoi
7 апреля 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

Вам это нравится? Поделитесь в социальных сетях!

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
  • Последние комментарии
  • Evgenii Legotckoi
    16 апреля 2025 г. 17:08
    Благодарю за отзыв. И вам желаю всяческих успехов!
  • IscanderChe
    12 апреля 2025 г. 17:12
    Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
  • AK
    1 апреля 2025 г. 11:41
    Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
  • Evgenii Legotckoi
    9 марта 2025 г. 21:02
    К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
  • VP
    9 марта 2025 г. 16:14
    Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…