Название: кэширование объектов (не web). [РЕШЕНО] Отправлено: spirits25 от Апрель 19, 2013, 11:26 Всем привет!
Столкнулся с простой задачей, но не знаю как лучше и правильнее её реализовать. Допустим есть города, улицы, дома. Для них есть city_id, street_id, builder_number - все целочисленные и с помощью всех трёх значений можно точно идентифицировать объект здания. Допустим, дом - это 3d модель, которая строится по каким-то данным, то есть строить каждый раз накладно. И вот мы сохраняем N (например, последних) зданий в памяти. У нас должны быть ключи (city_id, street_id, builder_number), чтобы проверить и взять(если есть) объект из памяти, что-то вроде myHash[15][32][87]. Как лучше организовать этот "словарь"? Использовать вложенные QHash или QMap? Или есть красивые и простые способы для этого? Название: Re: кэширование объектов (не web). Отправлено: mutineer от Апрель 19, 2013, 11:30 Если перебирать подряд не надо, а надо только получать доступ по конкретной тройке, то я бы советовал QHash с ключем-струтурой из трех значений
Название: Re: кэширование объектов (не web). Отправлено: spirits25 от Апрель 19, 2013, 11:38 Если перебирать подряд не надо, а надо только получать доступ по конкретной тройке, то я бы советовал QHash с ключем-струтурой из трех значений Спасибо, о структуре я что-то не подумал. Да, мне "надо только получать доступ по конкретной тройке"=) Не совсем по теме, порадовала оптимизация всего этого в Qt5 http://habrahabr.ru/post/170017/ Название: Re: кэширование объектов (не web). Отправлено: spirits25 от Апрель 19, 2013, 13:55 Если перебирать подряд не надо, а надо только получать доступ по конкретной тройке, то я бы советовал QHash с ключем-струтурой из трех значений Что-то не совсем у меня получается. На методе insert показывает ошибку. Нашёл такую строчку в доках Цитировать The key type of a QHash must provide operator==() and a global hash function called qHash() (see qHash). Может со структурой не прокатит? Или можете привести пример рабочего кода?Название: Re: кэширование объектов (не web). Отправлено: spirits25 от Апрель 19, 2013, 14:05 Попробовал добавить что-то вроде
Код:
Но всё равно ошибка. Цитировать ошибка: no matching function for call to 'qHash(const MyStructType&)' Как я понял, нужно не только добавить operator==, но и перегрузить QHash()? ~~~~~~~~~~~~~~~~~ Далее сделал так, но безуспешно: Код: struct MyStructType{ не работает, ни "tileNodeCache.insert(myStruct, "test");" , ни "tileNodeCache[myStruct] = "test";". ~~~~~~~~~~~~~~~~~~~~~~~~ Единственное решение, которое нашёл - http://stackoverflow.com/questions/13337896/qt4-qhash-hash-collision Название: Re: кэширование объектов (не web). Отправлено: mutineer от Апрель 19, 2013, 16:09 "не работает" - в смысле не добавляет? и ошибки не пишет никакие?
Название: Re: кэширование объектов (не web). Отправлено: spirits25 от Апрель 19, 2013, 16:16 "не работает" - в смысле не добавляет? и ошибки не пишет никакие? вот так всё отлично=) Код: class NewHashClass Название: Re: кэширование объектов (не web). Отправлено: Syveren от Апрель 22, 2013, 11:10 Если место в словаре ограничено, то есть удобный класс QCache.
При заполнении, удалит элемент, к которму было менее всего обращений. Название: Re: кэширование объектов (не web). Отправлено: spirits25 от Апрель 22, 2013, 11:23 Если место в словаре ограничено, то есть удобный класс QCache. При заполнении, удалит элемент, к которму было менее всего обращений. Это вместо QHash использовать? Он умеет правильно удалить объект помещённый в него? По QHash очень мало документации и я не пойму как перегрузить его для произвольного ключа.. Название: Re: кэширование объектов (не web). Отправлено: mutineer от Апрель 22, 2013, 11:40 По QHash очень мало документации и я не пойму как перегрузить его для произвольного ключа.. Ты же вверху написал что работает уже Название: Re: кэширование объектов (не web). Отправлено: spirits25 от Апрель 22, 2013, 11:45 Ты же вверху написал что работает уже Я описался, про QCache хотел написать=) Хотя разобрался, там даже что-то вроде переопределения qHash метода (как для QHash) делать не надо, в QCache указываются ключ и значение просто, не как указатели, а значение необходимо передавать как указатель. Меня это смутило. В общем и QHash и QCache работают, но юзать скорее буду QCache=) Всем большое спасибо!=) Название: Re: кэширование объектов (не web). [РЕШЕНО] Отправлено: romanster от Июль 18, 2013, 13:35 Здравствуйте элементарщина не получается если можно подскажите пожалуйста. Объявил класс :
class HashClass { public: HashClass(QString value1, QString value2, QString value3); QString value1() const; QString value2() const; QString value3() const; private: QString vvalue1, vvalue2, vvalue3; }; inline bool operator==(const HashClass &a, const HashClass &b) { return (a.value1() == b.value1()) && (a.value2() == b.value2()) && (a.value3() == b.value3()); } inline uint qHash(const HashClass &key) { return qHash(key.value1()) ^ qHash( key.value2() ) ^ qHash( key.value3() ); } HashClass::HashClass( QString value1, QString value2, QString value3 ) : vvalue1( value1 ),vvalue2( value2 ),vvalue3( value3 ){} QString HashClass::value1() const { return vvalue1;} QString HashClass::value2() const { return vvalue2;} QString HashClass::value3() const {return vvalue3;} Для кнопки описал процедурку подконнектил и пытаюсь что то записать в хэш и извлеч от туда: void window::Generate(){ QHash<HashClass,int> hash; hash[HashClass("1", "2","3")] = 10; QString s = ""; int n = hash.count(HashClass("1", "2","3")); QMessageBox::information(this, tr("inf"), s.number(n, 10)); } Выдает оч много ошибок и не компилируется не указывает что именно в листинге не так. |