qlist сортировка по параметру
Урок №4. Контейнеры в Qt5
Обновл. 16 Сен 2021 |
Библиотека контейнеров Qt5 является универсальной коллекцией шаблонов классов и алгоритмов, позволяющих программистам легко реализовывать общие структуры данных, такие как очереди, списки и стеки.
Контейнеры в Qt5
Контейнеры — это классы общего назначения, которые хранят в себе значения заданного типа. В языке С++ имеется свой набор контейнеров, который называется STL.
Стоит отметить, что идеологии контейнеров Qt и STL, при всей своей схожести, отличаются в следующем:
Фреймворк Qt5 предоставляет максимально богатый интерфейс, а копирование контейнера происходит за константное время, но цена этому — дополнительные проверки при доступе к разделяемым данным (implicit data sharing).
В свою очередь, STL предоставляет ограниченный интерфейс и следует идеологии уменьшения необоснованного расхода процессорного времени, памяти, ненужной нагрузки и пр.
Мы же, программируя на Qt, можем использовать как Qt-контейнеры, так и STL. Если вы не знакомы с STL или предпочитаете работать «только с Qt», то можете использовать классы Qt вместо классов STL.
На этом уроке мы рассмотрим следующие контейнеры:
Есть 2 типа контейнеров:
Последовательные — элементы хранятся друг за другом (последовательно). Примерами последовательных контейнеров являются QList, QVector, QLinkedList.
Ассоциативные — элементы хранятся в виде пары ключ-значение. Примерами ассоциативных контейнеров являются QMap и QHash.
Контейнер QVector
QVector — это шаблонный класс, который представляет динамический массив. Данный контейнер хранит свои элементы в соседних участках памяти, а доступ к ним осуществляется при помощи индексов. Для векторов с большим количеством элементов вставка значений в начало или в середину вектора может происходить довольно медленно, потому что это может сопровождаться перемещением большого количества элементов в памяти на одну позицию, поэтому в подобных случаях рекомендуется использовать QList вместо QVector.
Следующий пример показывает работу с вектором, элементами которого являются целые числа:
Результат выполнения программы:
Контейнер QList
QList — это контейнер, который предназначен для создания списка элементов. QList во многом похож на QVector. Он хранит список значений указанного типа и обеспечивает быстрый доступ к ним с помощью индексов, а также вставку и удаление элементов. Это один из наиболее часто используемых контейнеров в Qt.
Пример использования контейнера QList:
Результат выполнения программы:
Контейнер QStringList
QStringList — это контейнер, который предоставляет список строк. Он удобен прежде всего тем, что имеет дополнительные методы для фильтрации данных и легко взаимодействует со стандартными компонентами Qt, «понимающими» строки QString. Он также поддерживает быстрый доступ к элементам, их вставку и удаление.
В следующем примере мы создадим список строк из исходной строки и выведем их на экран:
Результат выполнения программы:
Контейнер QSet
QSet предоставляет однозначный (без повторений) математический набор с возможностью быстрого поиска элементов. Значения хранятся в неопределенном порядке.
В следующем примере QSet используется для хранения значений цветов. Как уже было сказано, данный контейнер является однозначным, поэтому нет смысла указывать одно и то же значение цвета несколько раз:
Результат выполнения программы:
Контейнер QMap
QMap — это ассоциативный массив (словарь), который хранит пары ключ-значение. Он обеспечивает быстрый поиск значения, ассоциированного с ключом. В следующем примере у нас есть два словаря, в которых мы сопоставляем ключ в виде строки целочисленному значению:
Результат выполнения программы:
Сортировка пользовательских классов
В следующем примере мы выполним сортировку объектов пользовательского класса в QList.
Ниже представлен заголовочный файл book.h для нашего пользовательского класса Book (книга):
А здесь реализация класса Book (у нас есть два геттеры для доступа к элементам класса):
Далее мы создадим несколько объектов класса Book и отсортируем их с помощью алгоритма std::sort():
CompareByTitle() — это функция сравнения, используемая алгоритмом сортировки:
Алгоритм std:: sort() сортирует книги в списке по заголовку:
Результат выполнения программы:
На этом всё! До следующего урока.
Поделиться в социальных сетях:
Урок №3. Дата и время в Qt5
Комментариев: 8
Здравствуйте! Было бы неплохо чуть подробнее описать когда правильнее использовать контейнеры stl, когда Qt.
Спасибо за уроки и за урок в частности.
Небольшое замечание по поводу QList. В уроке указано следующее по поводу QList:»Он хранит список значений указанного типа и обеспечивает быстрый доступ к ним с помощью индексов, а также быстрые вставку и удаление элементов.»
В документации же на qt (ссылка https://doc.qt.io/qt-5/qlist.html#details от 26.11.2019) написано » It stores items in a list that provides fast index-based access and index-based insertions and removals.», что можно перевести как » Он хранит элементы в списке, который обеспечивает быстрый доступ по индексу и, основанные на индексах, вставку и удаление.» Быстрой вставки и удаления в произвольное место QList не обеспечивает потому, что он представляет собой массив, в котором содержатся ссылки на хранимые в нем объекты. Согласно статье «Container Class» (https://doc.qt.io/qt-5/containers.html#algorithmic-complexity от 26.11.2019) сложность вставки для QList соответствует O(n), что соответствует сложности вставки для QVector.
В Qt5 объект, который обеспечивает «быструю» (сложностью O(1)) вставку и/или удаление в произвольное место обеспечивает контейнер QLinkedList.
Спасибо за замечание. В ближайшее время внесем в статью соответствующие правки. 🙂