Russian Qt Forum

Qt => Общие вопросы => Тема начата: Igors от Июнь 22, 2011, 09:26



Название: Как определить qHash
Отправлено: Igors от Июнь 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 я могу в конструкторе задать функтор, а как это сделать здесь?

Спасибо


Название: Re: Как определить qHash
Отправлено: asvil от Июнь 22, 2011, 09:41
Код:
uint qHash(const QPointF &p)
{
   return qHash(QPair<qreal, qreal> (p.x(), p.y()) );
}
Таки определите функцию выше того места где вы используете QHash и все.


Название: Re: Как определить qHash
Отправлено: Igors от Июнь 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;    // и это не проходит
 


Название: Re: Как определить qHash
Отправлено: alexman от Ноябрь 29, 2011, 16:01
Igors, удалось qHash для QPointF написать? А вообще интересует QHash для QList<double>?


Название: Re: Как определить qHash
Отправлено: Igors от Ноябрь 29, 2011, 19:31
Igors, удалось qHash для QPointF написать? А вообще интересует QHash для QList<double>?
Нет, не победил  :) Соскочил на STL (там хоть понятно что делать)


Название: Re: Как определить qHash
Отправлено: BRE от Ноябрь 29, 2011, 19:57
А вообще интересует QHash для QList<double>?
А что не получается?


Название: Re: Как определить qHash
Отправлено: alexman от Ноябрь 29, 2011, 22:29
А вообще интересует QHash для QList<double>?
А что не получается?
Есть реализация для uint qHash(const QVector<double> &vector)? Пока в голову приходит только запись вектора в строку...


Название: Re: Как определить qHash
Отправлено: BRE от Ноябрь 29, 2011, 23:10
Пока в голову приходит только запись вектора в строку...
Ну это один из вариантов.
Много зависит от данных, которые хранятся в векторе.
Если там большие числа, то можно их все сложить и умножить на размер вектора, результат привести к uint.
Или приводить каждое число к uint и хорить их между собой.
Но такие алгоритмы плохо подойдут, если в векторе хранятся числа от 0 до 1.
Если это критическая функция, наверное лучше придумать несколько вариантов хеш-функций и по-тестировать их на реальных данных.


Название: Re: Как определить qHash
Отправлено: alexman от Ноябрь 30, 2011, 09:07
Или приводить каждое число к uint и хорить их между собой.
Попробую этот вариант. Коллизии маловероятны. Чтобы лишний раз не считать значение qHash буду его кешировать.