На этом шаге рассмотрим множество 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>:
Удаляет элементы множества, не присутствующие в переданном множестве | |
Задает размер хэш-таблицы | |
Уменьшает объем внутренней хэш-таблицы для уменьшения используемого объема памяти | |
Удаляет все элементы множества, присутствующие в переданном множестве | |
Возвращает объект контейнера QList<T<, содержащий элементы из объекта контейнера QSet<T> | |
Объединяет элементы множеств |
На следующем шаге рассмотрим алгоритмы.