Подтвердить что ты не робот

Вектор с постоянным размером

Я ищу тип данных С++, похожий на std::vector, но без накладных расходов, связанных с динамическим изменением размера. Размер контейнера будет оставаться постоянным в течение всего срока его службы. Однако я считал, что использовать boost::array, что не подходит, потому что он требует, чтобы размер массива был известен во время компиляции, чего не имеет место в моей ситуации.

4b9b3361

Ответ 1

Измерьте, если динамическое изменение размера действительно влияет на производительность, прежде чем использовать что-то нестандартное.

Совет. С vector.reserve никогда не будет перераспределения массива.

Ответ 2

Нет лишних расходов при перераспределении, если вы не перераспределяете std::vector. Итак, либо:

  • постройте std::vector с известным размером вперед (std::vector x(100))
  • зарезервировать вызов (n) после построения, чтобы убедиться, что по крайней мере n элементов можно вставить в вектор перед перераспределением.

Ответ 3

Накладные расходы, вызванные возможностью динамического изменения размера std::vector, практически не существуют.

Если вам понадобился массив размера времени компиляции, поиск во многих случаях более эффективного, чем std::vector, действительно будет хорошей идеей.

Но разница между фиксированным временем выполнения и динамическим временем выполнения незначительна. std::vector является идеальным решением в этом случае.

Ответ 4

Я использовал класс шаблонов на основе идей из STLSoft auto_buffer (я объединил свою собственную реализацию из книги Мэтью Уилсона Imperfect С++ вместе с некоторыми идеями из реализации STLSoft). Он выделяет массив по умолчанию в стеке (или внедрен в объект класса), если он достаточно мал (на основе параметра шаблона, который вы предоставляете). Если ваше распределение времени выполнения больше этого, хранилище массивов происходит из кучи.

http://www.stlsoft.org/doc-1.9/classstlsoft_1_1auto__buffer.html

Итак, хорошая вещь в этом классе заключается в том, что для небольших небольших размеров распределение по существу не является оператором.

Ответ 5

Если размер массива неизвестен во время компиляции, то единственным вариантом в С++ является динамически выделенный массив. Вы можете использовать std::vector для гарантии RAII. Как говорили другие, факт изменения std::vector не означает, что вы должны изменить их размер. Создайте std::vector с правильным размером, а затем не назовите ничего, что изменит его размер.