Глава 11. Классы—контейнеры

Глава 11. Классы—контейнеры

Классы—контейнеры являются обычными шаблонными классами (template classes), которые предназначены для хранения в памяти элементов заданного типа. С++ уже предлагает много контейнеров в составе стандартной библиотеки шаблонов (STL — Standard Template Library), которая входит в стандартную библиотеку С++.

Qt обеспечивает свои собственные классы—контейнеры, поэтому в Qt—программах мы можем использовать как контейнеры Qt, так и контейнеры STL. Главное преимущество Qt—контейнеров — одинаковое поведение на всех платформах и неявное совместное использование данных. Неявное совместное использование или «копирование при записи» — это оптимизация, позволяющая передавать контейнеры целиком без существенного ухудшения производительности. Qt—контейнеры также снабжены простыми в применении классами итераторов в стиле Java; используя QDataStream, они могут быть оформлены в виде потоков данных и обычно приводят к меньшему объему программного кода в исполняемых модулях, чем при применении соответствующих STL—контейнеров. Наконец, для некоторого оборудования, на котором может работать Qtopia Core (версия Qt для мобильных устройств), единственно доступными являются Qt—контейнеры.

Qt предлагает как последовательные контейнеры, например QVector<T>, QLinkedList<T> и QList<T>, так и ассоциативные контейнеры, например QMap<K, T> и QHash<K, T>. Концептуально последовательные контейнеры отличаются тем, что элементы в них хранятся один за другим, в то время как в ассоциативных контейнерах хранятся пары ключ—значение.

Qt также содержит обобщенные алгоритмы, которые могут выполняться над произвольными контейнерами. Например, алгоритм qSort() сортирует последовательный контейнер, a qBinaryFind() выполняет двоичный поиск в упорядоченном последовательном контейнере. Эти алгоритмы аналогичны тем, которые предлагаются STL.

Если вы знакомы с контейнерами STL и библиотека STL уже установлена на платформах, на которых вы работаете, можете их использовать вместо контейнеров Qt или как дополнение к ним. Для получения более подробной информации относительно функций и классов STL достаточно неплохо начать с веб-сайта STL компании «SGI»: http://www.sgi.com/tech/stl/.

В данной главе мы также рассмотрим классы QString, QByteArray и QVariant, поскольку они имеют много общего с контейнерами. QString представляет собой 16-битовую строку символов в коде Unicode, которая широко используется в программном интерфейсе Qt. QByteArray является массивом 8-битовых символов типа char, которым удобно пользоваться для хранения произвольных двоичных данных. QVariant может хранить значения большинства типов С++ и Qt.