Russian Qt Forum
Июнь 16, 2024, 09:37 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: структура для хранения истории изменений (hash, map, list, ...)  (Прочитано 12196 раз)
unkeep
Гость
« : Июль 10, 2013, 11:05 »

Здравствуйте. В моей модели данных есть _history  (ключ-элемент) в которую заносятся новые элементы. В  Submit  пробегаемся по истории и сохраняем элементы в базу В ТОМ ПОРЯДКЕ В КОТОРОМ ОНИ БЫЛИ ДОБАВЛЕНЫ В ИСТОРИЮ.
вопрос: в чём хранить _history?
1) изначально был QHash - но он я так понимаю не упорядочивает данные.
2) QMap сортирует по ключу. А надо тупо оставить тот порядок, в котором вставлялись элементы
3) QList порядок - ок, но нельзя достать нужный элемент по ключу, не пробегаясь по всему списку

Ещё варианты?
пока склоняюсь к Qlist+QHash. (в списке лежат id, QHash - хранит эл-ты c ключом id)
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #1 : Июль 10, 2013, 11:22 »

пока склоняюсь к Qlist+QHash. (в списке лежат id, QHash - хранит эл-ты c ключом id)
Если нужен порядок и быстрый поиск, то вполне нормальное решение.
Правда я бы элементы хранил в QList (указатели на них), а в хеше хранил пару [id : указатель на элемент].
Записан
unkeep
Гость
« Ответ #2 : Июль 10, 2013, 11:37 »

Цитировать
Правда я бы элементы хранил в QList (указатели на них), а в хеше хранил пару [id : указатель на элемент].
да, пожалуй так будет лучше. спасибо.

жду ещё варианты, если не будет, завра закрою тему
Записан
unkeep
Гость
« Ответ #3 : Июль 10, 2013, 12:16 »

всё-таки всё-равно пробегаться нужно по списку.
когда из истории надо удалить, нужно и из QHash удалить и из Qlist. Не зная номера в списке, удалить по элементу можно только пробегаясь по списку. Ну или removeAll(указатель на эл-т), но тоже не быстро.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Июль 10, 2013, 12:29 »

Правда я бы элементы хранил в QList (указатели на них), а в хеше хранил пару [id : указатель на элемент].
Адреса элементов в QList могут "уплыть"

- при удалении/вставке если sizeof(element) <= sizeof(void) (маловероятно но все же - напр QString)
- при std::sort/qSort
- при std::remove_if

Почти наверняка этого не будет, но заботиться об этом напрягает. Если связываться с хранением адресов то лучше std::map. Первоначальный вариант неплох, но для удаления придется использовать линейный поиск по id. Можно сделать одним QHash, только

- запоминать id первого элемента в переменной
- в элементе хранить id следующего (или адрес - по вкусу)

если не будет, завра закрою тему
Ваше право, но зачем? Разве тема кому-то мешает?  Улыбающийся

Записан
unkeep
Гость
« Ответ #5 : Июль 10, 2013, 14:38 »

Цитата: Igors
Можно сделать одним QHash, только

- запоминать id первого элемента в переменной
- в элементе хранить id следующего (или адрес - по вкусу)

1)при удалении тогда надо будет лезть в предыдущий элемент и задавать новый id следующего
2)в случаях хранения элементов не как истории, указатель на следующий элемент не нужен

а что насчёт QCache? в описании ничего не написано про порядок в нём, но думаю что как и QHash(
« Последнее редактирование: Июль 10, 2013, 15:03 от unkeep » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #6 : Июль 10, 2013, 14:50 »

Адреса элементов в QList могут "уплыть"
Придумываете. Улыбающийся
В QList храним указатели на элементы, специально для вас в скобках написал. Улыбающийся
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #7 : Июль 10, 2013, 14:51 »

QList+QHash часто использую,и да, указатели - тогда все быстро и компактно
Записан
unkeep
Гость
« Ответ #8 : Июль 10, 2013, 15:36 »

QList+QHash часто использую,и да, указатели - тогда все быстро и компактно

хорошо, есть список и хеш.
Код
C++ (Qt)
QHash<IdType, TreeNode*> _history;
       QList <TreeNode*> _historyOrder;
1)получить эл-т
Код
C++ (Qt)
TreeNode* nodePtr = _history[id];
2)добавить
Код
C++ (Qt)
       _history.insert(newId, newNodePtr );
       _historyOrder.append(newNode);
3)удалить
Код
C++ (Qt)
           _history.remove(nodePtr->id);
           _historyOrder.removeOne(nodePtr);

removeOne(nodePtr) будет работать?
« Последнее редактирование: Июль 10, 2013, 16:13 от unkeep » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Июль 10, 2013, 16:21 »

1)при удалении тогда надо будет лезть в предыдущий элемент и задавать новый id следующего
2)в случаях хранения элементов не как истории, указатель на следующий элемент не нужен
Да, ну и слазите в следующий/предыдущий - зато один контейнер на все-про все

Придумываете. Улыбающийся
В QList храним указатели на элементы, специально для вас в скобках написал. Улыбающийся
Здесь указатели, во втором тоже, где ж тогда сами тела?  Улыбающийся

removeOne(nodePtr) будет работать?
Будет, но все равно это поиск перебором
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #10 : Июль 10, 2013, 16:46 »

Здесь указатели, во втором тоже, где ж тогда сами тела?  Улыбающийся
Внимание! В куче.
И владеть элементами должен QList.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Июль 10, 2013, 16:54 »

Внимание! В куче.
И владеть элементами должен QList.
Не то чтобы "ошибка" или "плохо", но как-то слишком развесисто, кучеряво  Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #12 : Июль 10, 2013, 17:00 »

Не то чтобы "ошибка" или "плохо"
Не обижайтесь, но как бы это сказать... не уверен что ваше мнение для меня будет важно, не говоря о его правильности. Подмигивающий

как-то слишком развесисто, кучеряво  Улыбающийся
Почему?
QList и так и так будет все хранить в куче развесисто и кучеряво. Улыбающийся
« Последнее редактирование: Июль 10, 2013, 17:04 от Old » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #13 : Июль 10, 2013, 17:17 »

removeOne(nodePtr) будет работать?
Смотрите, при добавлении в хеш элемента с ключем, который уже есть в хеше, приведет к замене элемента для этого ключа. Т.е. ключ-значение будет по прежнему одно.
А вот в QList вы добавите еще один элемент.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #14 : Июль 10, 2013, 18:27 »

А вот я бы еще подумал на счет связанного списка элементов.
Тогда будем иметь быстрое добавление, быстрое удаление из любого места по указателю и быстрый поиск по хешу.
« Последнее редактирование: Июль 11, 2013, 08:44 от Old » Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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