Простите мое невежество, мне кажется, что std::array
предназначен для замены STL ваших обычных массивов. Но поскольку размер массива должен быть передан в качестве параметра шаблона, это не позволяет нам создать std::array
с размером, известным только во время выполнения.
std::array<char,3> nums {1,2,3}; // Works.
constexpr size_t size = 3;
std::array<char,size> nums {1,2,3}; // Works.
const buf_size = GetSize();
std::array<char, buf_size> nums; // Doesn't work.
Я бы предположил, что одним из очень важных вариантов использования массива в C++ является создание структуры данных фиксированного размера на основе входных данных времени выполнения (скажем, выделение буфера для чтения файлов).
Обходные пути, которые я использую для этого:
// Create a array pointer for on-the-spot usecases like reading from a file.
char *data = new char[size];
...
delete[] data;
or:
// Use unique_ptr as a class member and I don't want to manage the memory myself.
std::unique_ptr<char[]> myarr_ = std::unique_ptr<char[]>(new char[size]);
Если меня не волнует фиксированный размер, я знаю, что могу использовать std::vector<char>
с предварительно определенным размером следующим образом:
std::vector<char> my_buf (buf_size);
Почему разработчики std::array
решили проигнорировать этот вариант использования? Возможно, я не понимаю реального варианта использования std::array
.
РЕДАКТИРОВАТЬ: Я думаю, мой вопрос можно сформулировать и другим способом: почему дизайнеры решили, что размер передается как параметр шаблона, а не как параметр конструктора? Не затруднит ли выбор последнего функционал, который сейчас есть у std::array
? Мне кажется, что это преднамеренный выбор дизайна, и я не понимаю, почему.
std::vector
нет принципиальной разницы. Потому что это и естьstd::vector
. - person Sam Varshavchik   schedule 15.02.2020std::vector
не является фиксированным размером. - person Plasty Grove   schedule 15.02.2020std::array
. - person Ted Lyngmo   schedule 15.02.2020std::dynarray
open-std.org/ JTC1/sc22/WG21/docs/papers/2013/n3662.html - person Brandon   schedule 15.02.2020std::array
с фиксированным размером во время компиляции? - person Galik   schedule 15.02.2020std::vector
не может быть изменен после его создания. Проблема решена. - person Sam Varshavchik   schedule 15.02.2020alloca
илиvariable length array
.. Это сделает то же самое. Возможно, он хочет, чтобы массив был выделен в стеке, а не в куче, но с размером времени выполнения. - person Brandon   schedule 15.02.2020std::vector
. Но я не был уверен, что упускаю что-то фундаментальное вstd::array
. - person Plasty Grove   schedule 15.02.2020