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

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

  Обновл. 29 Сен 2019  | 

 1409

 ǀ   2 

Библиотека контейнеров 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 (4 оценок, среднее: 5,00 из 5)
Загрузка...

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

  1. Аватар IAmInLoveWithC:

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

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

      Спасибо 🙂

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

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

telegram канал
НОВОСТИ RAVESLI