переменная длина std :: array как

Поскольку мои обычно используемые компиляторы C ++ допускают массивы переменной длины (например, массивы в зависимости от размера среды выполнения), мне интересно, есть ли что-то вроде std::array с переменным размером? Конечно std::vectorимеет переменный размер, но выделяет в куче и перераспределяет при необходимости.

Мне нравится иметь массив, выделенный стеком с размером, определенным во время выполнения. Есть ли std— Шаблон, который может показывать это? Может быть, используя std::vector с фиксированным максимальным размером?

13

Решение

В настоящее время ведется работа над двумя предложениями по переносу массивов фиксированного размера во время выполнения на 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.

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();
}

Но. Все еще содержимое вектора будет храниться в куче, а не в стеке. Проблема в том, что компилятор должен знать, сколько места должно быть выделено для функции до ее выполнения, поэтому просто невозможно сохранить данные переменной длины в стеке.

5

По вопросам рекламы [email protected]