быстрый map
От: carpenter Голландия  
Дата: 12.07.11 08:48
Оценка:
Давно задумываюсь о том что сохранение и чтение мапа из файла — достаточно затратная операция ,
и наверняка об этом задумывался не только я .

Для фикса имею такой план — сделать для мапа свой аллокатор , который будет знать какой объект он
обслуживает и выделять память последовательно ... т.е сначала ее резервировать,
затем сохранять весь блок и так же его считывать.
Для считывания добавить в мап функцию , которая будет пересчитывать указатели для элементов ,
в зависимости от того где память была аллоцирована.

Первый вопрос — делал ли ктото подобное ?
второй — критика и подводные камни по данному решению

спасибо
Весь мир — Кремль, а люди в нем — агенты
Re: быстрый map
От: Stanislav V. Zudin Россия  
Дата: 12.07.11 09:42
Оценка: 4 (1)
Здравствуйте, carpenter, Вы писали:

C>Давно задумываюсь о том что сохранение и чтение мапа из файла — достаточно затратная операция ,

C>и наверняка об этом задумывался не только я .

C>Первый вопрос — делал ли ктото подобное ?

C>второй — критика и подводные камни по данному решению

Делал.
Отказываемся от указателей. Используем индексы.
Храним все (и данные, и связи между элементами) в массивах (vector).
Чтение/запись получаются тривиальные, если хранить POD'ы — всего две операции чтения (прочитать размер, выделить память, прочитать данные).
При удалении элемента из массива его не выкидываем, а помещаем в список "свободных" (потом повторно используем) — индексы перестраивать не нужно.

Реализовывал одно-/двусвязные списки, хеши, коллекции строк, деревья.
На их основе делаются уже более сложные структуры. Полет нормальный.


Минусы:
Поведение и интерфейс получается не как у стандартных контейнеров.
Работает для POD'ов. конструкторы/деструкторы вызывать не получится.
_____________________
С уважением,
Stanislav V. Zudin
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.