Russian Qt Forum
Ноябрь 25, 2024, 10:43 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 [3]   Вниз
  Печать  
Автор Тема: порядок размещение ключей в QHash<int, int>  (Прочитано 27240 раз)
Alex03
Гость
« Ответ #30 : Январь 28, 2009, 11:14 »

Я бя сказал так:
QHash полезен тогда - когда операция сравнения ключей довольно накладная операция а также когда накладно хранение самих ключей.
Простейший случай такого ключа - QString. Т.е. если ключи представляют из себя довольно длинные строки, то накладно и их сравнение и их хранение в контейнере.
В текущей реализации QHash преобразует любой реальный ключ перед использованием во внутренний 32-х разрядный ключик, и именно его он потом и использует. При этом данные хранятся в отсортированном (так или иначе) по внутреннему ключу  виде.
Некоторые целочисленные типы ключа (типа int) транслируются во внутренний ключ без преобразований, поэтому ктото и наблюдает отсортированный список ключей.
Поэтому я не вижу особых преимуществ у QHash<int, XXX> перед QHash<int, XXX>.

terlan
Твой QHash<int, QHash<int, QHash<int, int> > > возможно полезно заменить на QHash<QByteArray, int> и засовывать твои три ключа в этот QByteArray.
Ну или не QByteArray а struct { int x, int y, int z } и соответственно operator==() и global qHash(Key) function для этой структуры.
Записан
kirill
Гость
« Ответ #31 : Январь 28, 2009, 11:48 »


Поэтому я не вижу особых преимуществ у QHash<int, XXX> перед QHash<int, XXX>.


чего? (с) Мак Сим
Записан
Dendy
Гость
« Ответ #32 : Январь 28, 2009, 11:59 »

Цитировать
Поэтому я не вижу особых преимуществ у QHash<int, XXX> перед QHash<int, XXX>

Поразительно, я тоже.

Да, кстати, QHash хранит не только огрызки от ключей, а и сами ключи. Но, в случае и Implicitly Shared классами (вроде QString) сами ключи занимают места ровно на один указатель, поэтому некритично.
Записан
Karl-Philipp
Гость
« Ответ #33 : Январь 28, 2009, 12:14 »

товарищи, всего-навсего опечатка Улыбающийся
по-моему имелось в виду
Цитировать
QHash<int, XXX> перед QHash<ХХХ, XXX>
Alex03, спасибо за ликбез. Однако для своей задачи уже выбрал базы данных.
Записан
ритт
Гость
« Ответ #34 : Январь 28, 2009, 12:19 »

а мне кажется. имелось в виду
Цитировать
Поэтому я не вижу особых преимуществ у QHash<int, XXX> перед QMap<int, XXX>.
Улыбающийся
Записан
Alex03
Гость
« Ответ #35 : Январь 28, 2009, 20:00 »

а мне кажется. имелось в виду
Цитировать
Поэтому я не вижу особых преимуществ у QHash<int, XXX> перед QMap<int, XXX>.
Улыбающийся
Угу.

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

Меня например поразила строчка:
Код:
        return uint((key >> (8 * sizeof(uint) - 1)) ^ key);
в
Код:
inline uint qHash(quint64 key)
{
    if (sizeof(quint64) > sizeof(uint)) {
        return uint((key >> (8 * sizeof(uint) - 1)) ^ key);
    } else {
        return uint(key);
    }
}
Записан
Alex03
Гость
« Ответ #36 : Январь 28, 2009, 20:05 »

Поизучал немного исходники.... (ибо не понял зачем там operator==() для ключа)
Поразился тем что оригинальные ключи тоже хранятся в QHash.... (сэкономить памяти не получатся)
С другой стороны теперь уверен в QHash-e, даже при одних и тех же результатах qHash() для разных ключей всё будет ОК.
Записан
Страниц: 1 2 [3]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.052 секунд. Запросов: 21.