Зависит от того, что вы подразумеваете под "и т. Д.", Под "добавлением и т. Д.".
Если «etc» включает в себя «удаление», то у вас возникает очевидная проблема: если вы удалите что-то в середине списка, то для поддержания индексации вам придется сдвигать все после него вниз, что означает обновление всех next
указатели.
Я думаю, что вы, возможно, слишком упростили свой пример. Если вам требуется непрерывное хранение, используйте вектор (либо P
, либо Item
, если в Item
есть что-то полезное, что вы удалили). Если у вас есть непрерывное хранилище, то нет смысла иметь указатель next
, поскольку вы можете просто вычислить его в Item
, добавив 1 к this
(а затем проверить границу, чтобы убедиться, что вы не достигли конец).
Если вам абсолютно необходимо общедоступное поле указателя next
, потому что оно является частью какого-то интерфейса, который вы реализуете, и который вы не можете изменить, вы можете обновить его в конструкторе копирования и operator=
для Item
, и интерфейс лучше запретить клиентам писать в него.
Невозможно указать распределителю памяти выделять непрерывное хранилище для отдельных выделений, если вы об этом и просите. Как это вообще сработает? Что если, когда вы приходите выделять, «следующий» адрес уже занят? Что если распределитель налагает некоторые накладные расходы для своих собственных управляющих структур (как это делают почти все распределители общего назначения), так что для выделения Item
требуется более sizeof(Item)
байтов? Вы можете какое-то время получить желаемое поведение с помощью фиксированного размера распределителя , но в конечном итоге ему понадобится новый блок или вы удалите что-то, и связь больше не будет сохраняться.