Мне нужно реализовать контейнер, который имеет большую часть функций vector (особенно push_back, insert, erase и sort), но никогда не выделяет память.
Я хочу, чтобы он начинался с внутреннего буфера размера времени компиляции, и я обещаю, что ему никогда не придется выходить за пределы этого размера.
Могу ли я использовать allocator для этого? Если да, то как? Если нет, то как повторно использовать максимальное количество существующего кода из стандартной библиотеки?
Я мог бы использовать массив и отдельную переменную size, но мне нравится объектно-ориентированное программирование, и эта структура данных появляется достаточно часто, чтобы гарантировать выделенный класс/шаблон.
Кроме того, push_back не будет иметь смысла для массива фиксированного размера./vector Пользователи потенциально могут запутаться из-за этого, поскольку вы измените его обычное значение.
Кроме того, похоже, что это просто запрос фрагмента кода, как это делается в домашних заданиях, без подробного объяснения вещей/требований и попыток на данный момент.
Написание с нуля того, что вы конкретно хотите в соответствии с вашими требованиями/потребностями, выглядит здесь лучшим подходом/идеей.
Распределитель на самом деле не является хорошим решением требования отсутствия распределения. Нет ничего плохого в том, чтобы обернуть отдельную переменную size и std::array в один класс (при этом размер массива является константой времени компиляции, а функции-члены обеспечивают требование, чтобы отдельная переменная size не превышала размер массива). Имейте в виду, что на практике размер массива ограничен «размером стека», который часто ограничивается квотами и значительно меньше доступной оперативной памяти.
Вероятно, вы можете использовать std::vector с собственным распределителем из буфера фиксированного размера, сохраняя при этом интерфейс. Вот то, что я использовал несколько лет назад, на основе массива: github.com/gbresearch/yadro/blob/master/container/…
@Gene Вы не можете сделать это с помощью std::allocator или, по крайней мере, напрямую. Требования распределителя требуют, чтобы его можно было копировать, и копия должна иметь возможность освободить память, выделенную оригиналом.
Это предлагается как std::inplace_vector (ранее: static_vector). Полная реализация доступна от многих третьих лиц, в частности boost::static_vector eastl::fixedVector, folly::small_vector<T, Size, folly::small_vector_policy::NoHeap>
Я думаю, вы имеете в виду «никогда не перераспределяет», вам придется выделить память хотя бы один раз.





Как отмечалось в комментариях, существует несколько реализаций.
Это также предлагается для будущей версии C++.
std::array