Урок №4. Контейнеры в Qt5

  Дмитрий Бушуев  | 

  Обновл. 1 Дек 2019  | 

 2696

 ǀ   5 

Библиотека контейнеров Qt5 является универсальной коллекцией шаблонов классов и алгоритмов, позволяющих программистам легко реализовывать общие структуры данных, такие как очереди, списки и стеки.

Контейнеры

Контейнеры — это классы общего назначения, которые хранят в себе значения заданного типа. В языке С++ имеется свой набор контейнеров, который называется STL.

Стоит отметить, что идеологии контейнеров Qt и STL, при всей своей схожести, отличаются в следующем:

   Фреймворк Qt5 предоставляет максимально богатый интерфейс, а копирование контейнера происходит за константное время, но ценой этому являются дополнительные проверки при доступе к разделяемым данным (implicit data sharing).

   В свою очередь, STL предоставляет ограниченный интерфейс и следует идеологии уменьшения необоснованного расхода процессорного времени, памяти, ненужной нагрузки и пр.

Мы же, программируя на Qt, можем использовать как Qt-контейнеры, так и STL. Если вы не знакомы с STL, или предпочитаете работать «только с Qt», то можете использовать эти классы вместо классов STL.

В этом уроке мы будем рассматривать следующие контейнеры: QVector, QList, QStringList, QSet и QMap.

Есть два типа контейнеров:

   последовательные — элементы хранятся друг за другом (последовательно). Примерами последовательных контейнеров являются 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 (у нас есть два геттеры для доступа к элементам класса):

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

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

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

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

В этом уроке мы рассмотрели работу с контейнерами в Qt5.


Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (8 оценок, среднее: 5,00 из 5)
Загрузка...

Комментариев: 5

  1. Аватар Юрий:

    Небольшое замечание по поводу 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.

    1. Дмитрий Бушуев Дмитрий Бушуев:

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

  2. Аватар IAmInLoveWithC:

    Классный урок !!!

    1. Дмитрий Бушуев Дмитрий Бушуев:

      Спасибо 🙂

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

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