Давно задумываюсь о том что сохранение и чтение мапа из файла — достаточно затратная операция ,
и наверняка об этом задумывался не только я .
Для фикса имею такой план — сделать для мапа свой аллокатор , который будет знать какой объект он
обслуживает и выделять память последовательно ... т.е сначала ее резервировать,
затем сохранять весь блок и так же его считывать.
Для считывания добавить в мап функцию , которая будет пересчитывать указатели для элементов ,
в зависимости от того где память была аллоцирована.
Первый вопрос — делал ли ктото подобное ?
второй — критика и подводные камни по данному решению
Здравствуйте, carpenter, Вы писали:
C>Давно задумываюсь о том что сохранение и чтение мапа из файла — достаточно затратная операция , C>и наверняка об этом задумывался не только я .
C>Первый вопрос — делал ли ктото подобное ? C>второй — критика и подводные камни по данному решению
Делал.
Отказываемся от указателей. Используем индексы.
Храним все (и данные, и связи между элементами) в массивах (vector).
Чтение/запись получаются тривиальные, если хранить POD'ы — всего две операции чтения (прочитать размер, выделить память, прочитать данные).
При удалении элемента из массива его не выкидываем, а помещаем в список "свободных" (потом повторно используем) — индексы перестраивать не нужно.
Реализовывал одно-/двусвязные списки, хеши, коллекции строк, деревья.
На их основе делаются уже более сложные структуры. Полет нормальный.
Минусы:
Поведение и интерфейс получается не как у стандартных контейнеров.
Работает для POD'ов. конструкторы/деструкторы вызывать не получится.
_____________________
С уважением,
Stanislav V. Zudin