Как реализовать массив, который может расти до предела и никогда не выделяться?

Мне нужно реализовать контейнер, который имеет большую часть функций vector (особенно push_back, insert, erase и sort), но никогда не выделяет память.

Я хочу, чтобы он начинался с внутреннего буфера размера времени компиляции, и я обещаю, что ему никогда не придется выходить за пределы этого размера.

Могу ли я использовать allocator для этого? Если да, то как? Если нет, то как повторно использовать максимальное количество существующего кода из стандартной библиотеки?

Я мог бы использовать массив и отдельную переменную size, но мне нравится объектно-ориентированное программирование, и эта структура данных появляется достаточно часто, чтобы гарантировать выделенный класс/шаблон.

В этом ответе в Вектор постоянного размера говорится: «Невозможно определить вектор постоянного размера». И почему бы просто не использовать std::array
user12002570 02.08.2024 07:42

Кроме того, push_back не будет иметь смысла для массива фиксированного размера./vector Пользователи потенциально могут запутаться из-за этого, поскольку вы измените его обычное значение.

user12002570 02.08.2024 07:44

Кроме того, похоже, что это просто запрос фрагмента кода, как это делается в домашних заданиях, без подробного объяснения вещей/требований и попыток на данный момент.

user12002570 02.08.2024 07:47

Написание с нуля того, что вы конкретно хотите в соответствии с вашими требованиями/потребностями, выглядит здесь лучшим подходом/идеей.

user12002570 02.08.2024 07:48

Распределитель на самом деле не является хорошим решением требования отсутствия распределения. Нет ничего плохого в том, чтобы обернуть отдельную переменную size и std::array в один класс (при этом размер массива является константой времени компиляции, а функции-члены обеспечивают требование, чтобы отдельная переменная size не превышала размер массива). Имейте в виду, что на практике размер массива ограничен «размером стека», который часто ограничивается квотами и значительно меньше доступной оперативной памяти.

Peter 02.08.2024 07:52

Вероятно, вы можете использовать std::vector с собственным распределителем из буфера фиксированного размера, сохраняя при этом интерфейс. Вот то, что я использовал несколько лет назад, на основе массива: github.com/gbresearch/yadro/blob/master/container/…

Gene 02.08.2024 07:52

@Gene Вы не можете сделать это с помощью std::allocator или, по крайней мере, напрямую. Требования распределителя требуют, чтобы его можно было копировать, и копия должна иметь возможность освободить память, выделенную оригиналом.

HolyBlackCat 02.08.2024 07:59

Это предлагается как std::inplace_vector (ранее: static_vector). Полная реализация доступна от многих третьих лиц, в частности boost::static_vector eastl::fixedVector, folly::small_vector<T, Size, folly::small_vector_policy::NoHeap>

Artyer 02.08.2024 08:17

Я думаю, вы имеете в виду «никогда не перераспределяет», вам придется выделить память хотя бы один раз.

Pepijn Kramer 02.08.2024 08:53
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
9
97
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как отмечалось в комментариях, существует несколько реализаций.

  1. boost::static_vector
  2. Eastl::fixedVector
  3. глупость::small_vector<T, Размер, глупость::small_vector_policy::NoHeap>

Это также предлагается для будущей версии C++.

Другие вопросы по теме