Шаг 69.
Библиотека Qt.
Множество QSet<T>

    На этом шаге рассмотрим множество QSet<T>.

    Как заметил немецкий математик Георг Кантор, "Множество — это есть многое, мысленно подразумеваемое нами как единое". Это "единое", в контексте Tulip, есть не что иное, как контейнер QSet<T>, который записывает элементы в некотором порядке и предоставляет возможность очень быстрого просмотра значений и выполнения с ними операций, характерных для множеств, таких как объединение, пересечение и разность.

    Необходимым условием является то, что ключи должны быть уникальны. Класс QSet<T> базируется на использовании хэш-таблицы QHash<K,T>, но является вырожденным ее вариантом, т. к. с ключами не связываются никакие значения. Главная задача этого класса заключается в хранении ключей. Контейнер QSet<T> можно использовать в качестве неупорядоченного списка для быстрого поиска данных. Пример множеств показан на рис. 1, на котором изображены два множества, состоящие из трех элементов каждое.


Рис.1. Пример множеств

    Операции, которые можно проводить с множествами, проиллюстрированы на рис. 2.


Рис.2. Некоторые операции над множествами

    Создадим два множества и запишем в них элементы в соответствии с рис. 1.

QSet<QString> set1;
QSet<QString> set2;
set1 << "Turbo Pascal" << "Borland Delphi" << "Borland C++";
set2 << "Mathlab" << "Borland Delphi" << "MathCad";

    Произведем операцию объединения (см. рис. 2) этих двух множеств, а для того чтобы элементы множеств остались неизмененными, введем промежуточное множество setResult:

QSet<QString> setResult = set1;
setResult.unite(set2);
qDebug() << "Объединение = " " setResult.toList();

    На экране должно быть показано следующее:


Рис.3. Результат объединения множеств

    Теперь произведем операцию пересечения (см. рис. 2):

setResult = set1;
setResult.intersect(set2);
qDebug() << "Пересечение set1 с set2 = " << setResult.toList();

    Поскольку два множества имеют только один одинаковый элемент, то на экране мы увидим:


Рис.4. Результат пересечения множеств

    И последняя операция, которую мы произведем, будет операция разности двух множеств (см. рис. 2):

setResult = set1;
setResult.subtract(set2);
qDebug() << "Разность set1 с set2 = " << setResult.toList();

    Множество set1 отличается от множества set2 двумя элементами, поэтому на экране должно отобразиться:


Рис.5. Результат разности множеств

    Файлы приложения можно взять здесь.

    В табл. 1 сведены методы для контейнера QSet<T>:

Таблица 1. Некоторые методы контейнера QSet<T>
Метод
Описание
intersect()
Удаляет элементы множества, не присутствующие в переданном множестве
reserve()
Задает размер хэш-таблицы
squeeze()
Уменьшает объем внутренней хэш-таблицы для уменьшения используемого объема памяти
subtract()
Удаляет все элементы множества, присутствующие в переданном множестве
toList()
Возвращает объект контейнера QList<T<, содержащий элементы из объекта контейнера QSet<T>
unite()
Объединяет элементы множеств

    На следующем шаге рассмотрим алгоритмы.




Предыдущий шаг Содержание Следующий шаг