21Фев/120
QHash и структура в качестве ключа.
Тема легкая, но мне, почему-то далась достаточно напряжно.
Задача: использовать в качестве ключа QHash структуру.
Читаем документацию - для данной операции достаточно в структуре определить оператор "==" и написать глобальную функцию qHash для нашей структуры.
Решение:
struct MyStruct
{
quint8 a1;
quint8 a2;
quint8 a3;
quint8 a4;
bool operator==(const MyStruct struc) const
{
return (a1 == struc.a1 &&
a2 == struc.a2 &&
a3 == struc.a3 &&
a4 == struc.a4);
}
};
uint qHash(const MyStruct &struc)
{
//как-то вычисляем хеш
//в моём случае в структуре содержалось 4 целых числа и я просто записал их в одно число со сдвигом
uint result = struc.a1;
result <<=(sizeof(quint8)*8);
result = result|struc.a2;
result <<=(sizeof(quint8)*8);
result = result|struc.a3;
result <<=(sizeof(quint8)*8);
result = result|struc.a4;
return result;
}
Использование:
QHash < MyStruct, QString > myQHash
Всё работает отлично.
А вот при попытке использовать еще одну структуру в качестве значения QHash
QHash < MyStruct, MyOtherStruct > myOtherQHash
При запросе значения по ключу - всё работает отлично, но при попытке получить ключ по значению получаем надпись:
no match for 'operator==' in 'i.QHash<Key, T>::const_iterator::value [with Key = MyStruct, T = MyOtherStruct]() == avalue'
Страшная надпись, не правда ли? :)
Причина - не хватает операции "==" во второй структуре. Добавляем её и всё работает.
Вот так.
struct, key, qhash
Комментарии (0)
Пинги (0)
(подписаться на новые комментарии в этой ветке)
Нет обратных ссылок на эту запись.
Leave a comment