Есть ли такой контейнер, как тот, о котором я спрашиваю?

Я хотел реализовать контейнерный объект c ++ со следующими свойствами:

  1. Сохраняет все элементы непрерывно в памяти, чтобы их можно было повторять, не вызывая ошибок кэша.
  2. Расширяемый, не как массивы, которые имеют фиксированный размер, но так же, как векторы в stl, которые могут регулировать выделенную память для размещения столько элементов, сколько я добавляю.
  3. Не перераспределяет элементы на новое место в памяти при изменении размера, как в случае векторов std. Мне нужно сохранить указатели на элементы, которые находятся в контейнере, поэтому перераспределение указателей не должно быть недействительным при добавлении новых элементов.
  4. Должен быть совместим с ранжированными циклами для циклов, чтобы содержимое можно было эффективно перебирать.

Существует ли какой-либо контейнер, который отвечает этим требованиям, в какой-либо внешней библиотеке или мне нужно реализовать свой собственный в этом случае?

Как отмечалось в некоторых комментариях, не все желаемые свойства могут быть реализованы вместе. Я должен был над этим, и я имею в виду реализацию. Так как сделать вещи смежными полностью невозможно, возможен некоторый разрыв. Например, контейнер данных изначально выделяет пространство для 10 элементов, а когда достигается ограничение, выделяет другой кусок памяти, вдвое превышающий объем предыдущего блока, но не копирует существующие элементы в этот новый блок. Вместо этого он заполняет новый блок новыми элементами, которые я вставил в него. Это минимизирует количество разрывов.

Итак, есть ли структура данных, которая уже реализует это?

-2

Решение

ИМХО, структура данных, которая наиболее близка к вашей потребности
Deque в STL. В основном он хранит кусок смежных воспоминаний и
обеспечивает как итераторы произвольного доступа, так и стабильность в push_back
(ваши элементы остаются на том же месте, хотя итераторы недействительны).
Единственная проблема с вашими ограничениями в том, что память не смежна
везде но, как прокомментировали другие, ваш набор потребностей несовместим, если вы хотите
чтобы полностью удовлетворить их всех.
Кстати, одна приятная вещь с этим контейнером, что вы также можете нажать на
передний.

3

Другие решения


По вопросам рекламы [email protected]