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