Вы говорите "это должен быть тип данных POD".Ваша коллекция не должна быть POD?
Если тип данных - POD, то std::vector
предоставляет необходимую вам функциональность, и многие реализации оптимизируют семантику копирования / перемещения, когда данные являются POD.
Зачем вам нужно заменить вектор?
Чтобы ответить на вопрос напрямую, хотя: я сомневаюсь, что такой класс в boost, как vector (поддержание размера), уже достигает цели, и поэтому они не будут рассматривать реальную необходимостьдля этого.boost::array
не имеет концепции другого размера и емкости.
Вы можете легко написать свой собственный класс-оболочку для вектора или Boost :: array для выброса, если он превысил установленную вами емкость.
Теперь, если вы собираетесь реализовать это, наиболее вероятным подходом будет класс, который содержит вектор или массив надстроек или обычный массив, а затем реализует все ваши функции.Я бы сказал, что это интуитивно понятно, но может быть более умное решение перегрузить распределитель, вместо того чтобы внутренне удерживать boost :: array и использовать его для «выделения» вашего вектора.Если ваш распределитель исчерпал емкость (потому что его внутренний массив заполнен), вы бросаете (вероятно, должно быть bad_alloc).Затем пользователи просто используют класс как вектор и могут вызывать все его функции, но вы бросите, если они попытаются увеличить вектор выше его размера.
Из-за природы вектора ваш распределитель не должен работать каккуча, где вы освобождаете определенные объекты.Вы просто будете поддерживать непрерывный буфер.
Что касается проблемы POD или почти POD, то фактические данные в векторе гарантированно являются непрерывным буфером, а внутри вашего распределителя используется boost :: array, так чтоэто будет смежно.Если вы хотите что-то для сериализации, тогда boost :: serialize уже будет правильно работать с векторами.
Вся коллекция, контейнер и содержимое должны быть единым блоком памяти фиксированного размера: определяется при компиляции.время
Ваш распределитель может выглядеть так:
typename< typename T, size_t SIZE >
class Allocator
{
struct Data
{
size_t num_used;
T[SIZE] data;
} d;
public:
// implement allocator's methods
};
Реализация эти