Поскольку мои обычно используемые компиляторы C ++ допускают массивы переменной длины (например, массивы в зависимости от размера среды выполнения), мне интересно, есть ли что-то вроде std::array
с переменным размером? Конечно std::vector
имеет переменный размер, но выделяет в куче и перераспределяет при необходимости.
Мне нравится иметь массив, выделенный стеком с размером, определенным во время выполнения. Есть ли std
— Шаблон, который может показывать это? Может быть, используя std::vector
с фиксированным максимальным размером?
В настоящее время ведется работа над двумя предложениями по переносу массивов фиксированного размера во время выполнения на C ++, которые могут вас заинтересовать:
Размерные массивы с автоматическим хранением. Это сделало бы размерные массивы во время выполнения языковой функцией (как в C11). Так что вы могли бы сделать:
void foo(std::size_t size) {
int arr[size];
}
Динамические массивы C ++. Это принесет новый контейнер в библиотеку, std::dynarray
, который имеет фиксированный размер при строительстве. Он предназначен для оптимизации для размещения в стеке, когда это возможно.
void foo(std::size_t size) {
std::dynarray<int> arr(size);
}
Они оба работают как часть технической спецификации Array Extensions, которая будет выпущена вместе с C ++ 14.
Как сказал Даниэль в комментарии, размер std::array
указывается в качестве параметра шаблона, поэтому его нельзя установить во время выполнения.
Вы можете построить std::vector
передавая минимальную емкость через параметр конструктора:
#include <vector>
int main(int argc, char * argv[])
{
std::vector<int> a;
a.reserve(5);
std::cout << a.capacity() << "\n";
std::cout << a.size();
getchar();
}
Но. Все еще содержимое вектора будет храниться в куче, а не в стеке. Проблема в том, что компилятор должен знать, сколько места должно быть выделено для функции до ее выполнения, поэтому просто невозможно сохранить данные переменной длины в стеке.