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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как определить qHash  (Прочитано 6873 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Июнь 22, 2011, 09:26 »

Добрый день

Код
C++ (Qt)
QSet <QPointF> theSet;  // тот же эффект и для QHash
theSet.insert(QPointF());
 
Так не проходит, нужна ф-ция
Код
C++ (Qt)
uint qHash(const QPointF &);
 
Вопрос первый: где мне ее взять или как сконструировать? Конечно QPointF для примера, использоваться будут свои структуры

Код
C++ (Qt)
QHash <QPointF *, int> theHash;
theHash[&pt] = 1;
 
Вопрос второй: так будут сравниваться указатели, а не их содержимое как мне нужно. В std::set я могу в конструкторе задать функтор, а как это сделать здесь?

Спасибо
Записан
asvil
Гость
« Ответ #1 : Июнь 22, 2011, 09:41 »

Код:
uint qHash(const QPointF &p)
{
   return qHash(QPair<qreal, qreal> (p.x(), p.y()) );
}
Таки определите функцию выше того места где вы используете QHash и все.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Июнь 22, 2011, 10:37 »

Код:
uint qHash(const QPointF &p)
{
   return qHash(QPair<qreal, qreal> (p.x(), p.y()) );
}
Таки определите функцию выше того места где вы используете QHash и все.
Не все, так не проходит, вот содержательная часть error

Цитировать
error: call of overloaded 'qHash(const float&)' is ambiguous

note: candidates are:
uint qHash(char)
uint qHash(uchar)
uint qHash(signed char)
uint qHash(ushort)
uint qHash(short int)
..
// длинный список но float в нем нет
Хорошо, пробую так
Код
C++ (Qt)
inline uint qHash( float key ) { return *(uint *) &key; }
// inline uint qHash( const float & key ) { return *(uint *) &key; }  // или так
 
QSet <QPointF> theSet;  // та же ошибка
QSet <float> theSet2;    // и это не проходит
 
Записан
alexman
Гость
« Ответ #3 : Ноябрь 29, 2011, 16:01 »

Igors, удалось qHash для QPointF написать? А вообще интересует QHash для QList<double>?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Ноябрь 29, 2011, 19:31 »

Igors, удалось qHash для QPointF написать? А вообще интересует QHash для QList<double>?
Нет, не победил  Улыбающийся Соскочил на STL (там хоть понятно что делать)
Записан
BRE
Гость
« Ответ #5 : Ноябрь 29, 2011, 19:57 »

А вообще интересует QHash для QList<double>?
А что не получается?
Записан
alexman
Гость
« Ответ #6 : Ноябрь 29, 2011, 22:29 »

А вообще интересует QHash для QList<double>?
А что не получается?
Есть реализация для uint qHash(const QVector<double> &vector)? Пока в голову приходит только запись вектора в строку...
Записан
BRE
Гость
« Ответ #7 : Ноябрь 29, 2011, 23:10 »

Пока в голову приходит только запись вектора в строку...
Ну это один из вариантов.
Много зависит от данных, которые хранятся в векторе.
Если там большие числа, то можно их все сложить и умножить на размер вектора, результат привести к uint.
Или приводить каждое число к uint и хорить их между собой.
Но такие алгоритмы плохо подойдут, если в векторе хранятся числа от 0 до 1.
Если это критическая функция, наверное лучше придумать несколько вариантов хеш-функций и по-тестировать их на реальных данных.
Записан
alexman
Гость
« Ответ #8 : Ноябрь 30, 2011, 09:07 »

Или приводить каждое число к uint и хорить их между собой.
Попробую этот вариант. Коллизии маловероятны. Чтобы лишний раз не считать значение qHash буду его кешировать.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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