Шаг 68.
Библиотека Qt.
Хэши QHash<K,T> и QMultiHash<K,T>

    На этом шаге рассмотрим хэши QHash<K,T> и QMultiHash<K,T>.

    Функциональность хэшей очень похожа на словарь QMap<K,T>, с той лишь разницей, что вместо сортировки по ключу этот класс использует хэш-таблицу. Это позволяет ему осуществлять поиск ключевых значений гораздо быстрее, чем это делает словарь QMap<K,T>.

    Так же, как и в случае со словарем QMap<K,T>, следует соблюдать осторожность при использовании оператора индексации [], т. к. задание ключа, для которого элемент не существует, приведет к тому, что элемент будет создан. Поэтому важно проверять существование элемента, привязанного к ключу при помощи метода contains() контейнера.

    Если вы намереваетесь разместить в хэш QHash<K,T> объекты собственных классов, то вам необходимо будет реализовать оператор сравнения == и специализированную функцию qHash() для вашего класса. Вот пример реализации оператора сравнения:

inline bool operator==(const MyClass& mc1, const MyClass& mc2)
{
   return (mc1.firstName() == mc2.firstName()
   && mc1.secondName() == mc2.secondName()
   );
}

    Функция qHash() должна возвращать число, которое должно быть уникальным для каждого находящегося в хэше элемента. Например:

inline uint qHash(const MyClass& mc)
{
   return qHash(mc.firstName()) ^ qHash(mc.secondName());
}

    Класс QMultiHash<K,T> унаследован от QHash<K,T>. Он позволяет размещать значения с одинаковыми ключами и, в целом, похож на QMultiMap<K,T>, но учитывает специфику своего родительского класса. Методы, присущие только для этих контейнеров, указаны в табл. 1.

Таблица 1. Некоторые методы контейнеров QHash<K,T> и QMultiHash<K,T>
Метод
Описание
capacity()
Возвращает размер хэш-таблицы
reserve()
Задает размер хэш-таблицы
squeeze()
Уменьшает объем внутренней хэш-таблицы для уменьшения используемого объема памяти

    На следующем шаге рассмотрим множество QSet<T>.




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