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 сортировка по параметру. Картинка про qlist сортировка по параметру. Фото qlist сортировка по параметру

Контейнер QList

QList — это контейнер, который предназначен для создания списка элементов. QList во многом похож на QVector. Он хранит список значений указанного типа и обеспечивает быстрый доступ к ним с помощью индексов, а также вставку и удаление элементов. Это один из наиболее часто используемых контейнеров в Qt.

Пример использования контейнера QList:

Результат выполнения программы:

qlist сортировка по параметру. Смотреть фото qlist сортировка по параметру. Смотреть картинку qlist сортировка по параметру. Картинка про qlist сортировка по параметру. Фото qlist сортировка по параметру

Контейнер QStringList

QStringList — это контейнер, который предоставляет список строк. Он удобен прежде всего тем, что имеет дополнительные методы для фильтрации данных и легко взаимодействует со стандартными компонентами Qt, «понимающими» строки QString. Он также поддерживает быстрый доступ к элементам, их вставку и удаление.

В следующем примере мы создадим список строк из исходной строки и выведем их на экран:

Результат выполнения программы:

qlist сортировка по параметру. Смотреть фото qlist сортировка по параметру. Смотреть картинку qlist сортировка по параметру. Картинка про qlist сортировка по параметру. Фото qlist сортировка по параметру

Контейнер QSet

QSet предоставляет однозначный (без повторений) математический набор с возможностью быстрого поиска элементов. Значения хранятся в неопределенном порядке.

В следующем примере QSet используется для хранения значений цветов. Как уже было сказано, данный контейнер является однозначным, поэтому нет смысла указывать одно и то же значение цвета несколько раз:

Результат выполнения программы:

qlist сортировка по параметру. Смотреть фото qlist сортировка по параметру. Смотреть картинку qlist сортировка по параметру. Картинка про qlist сортировка по параметру. Фото qlist сортировка по параметру

Контейнер QMap

QMap — это ассоциативный массив (словарь), который хранит пары ключ-значение. Он обеспечивает быстрый поиск значения, ассоциированного с ключом. В следующем примере у нас есть два словаря, в которых мы сопоставляем ключ в виде строки целочисленному значению:

Результат выполнения программы:

qlist сортировка по параметру. Смотреть фото qlist сортировка по параметру. Смотреть картинку qlist сортировка по параметру. Картинка про qlist сортировка по параметру. Фото qlist сортировка по параметру

Сортировка пользовательских классов

В следующем примере мы выполним сортировку объектов пользовательского класса в QList.

Ниже представлен заголовочный файл book.h для нашего пользовательского класса Book (книга):

А здесь реализация класса Book (у нас есть два геттеры для доступа к элементам класса):

Далее мы создадим несколько объектов класса Book и отсортируем их с помощью алгоритма std::sort():

CompareByTitle() — это функция сравнения, используемая алгоритмом сортировки:

Алгоритм std:: sort() сортирует книги в списке по заголовку:

Результат выполнения программы:

qlist сортировка по параметру. Смотреть фото qlist сортировка по параметру. Смотреть картинку qlist сортировка по параметру. Картинка про qlist сортировка по параметру. Фото qlist сортировка по параметру

На этом всё! До следующего урока.

Поделиться в социальных сетях:

Урок №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.

Спасибо за замечание. В ближайшее время внесем в статью соответствующие правки. 🙂

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *