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

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

11
задан dzhelil 10 August 2010 в 05:58
поделиться

5 ответов

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

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

15
ответ дан 3 December 2019 в 02:29
поделиться

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

  • создайте std :: vector с известным размером впереди ( std :: vector x (100) )
  • вызовите резерв (n) после построения, чтобы убедиться, что по крайней мере n элементы могут быть помещены в вектор до того, как произойдет перераспределение.
10
ответ дан 3 December 2019 в 02:29
поделиться

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

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

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

2
ответ дан 3 December 2019 в 02:29
поделиться

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

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

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

4
ответ дан 3 December 2019 в 02:29
поделиться

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

1
ответ дан 3 December 2019 в 02:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: