Исходя из того, как вы пишете второй аргумент функции
int (&hiddenNodes)[n]
Полагаю, вы не опытный программист на C / C ++. Дело в том, что n
будет игнорироваться компилятором, и вы потеряете возможность проверить, что размер массива C, который вы здесь введете, и n
, переданный как параметр шаблона, будет равны друг другу или, по крайней мере, связаны друг с другом.
Итак, забудьте о шаблонах. Go std::vector<int>
.
Единственное преимущество использования шаблона (или std::array
) здесь заключается в том, что компилятор может оптимизировать ваш код лучше, чем с std::vector
. Однако шансы на то, что вы сможете его использовать, очень малы, и даже если вам это удастся, ускорение вряд ли будет измеримо.
Преимущество std::vector
заключается в том, что он практически такой же быстрый и простой в использовании, как и std::array
, но гораздо более гибкий (его размер настраивается во время выполнения). Если вы go std::array
или шаблоны и собираетесь использовать в своей программе скрытые слои разных размеров, вскоре вам придется превратить другие части вашей программы в шаблоны, и скорее всего, вместо реализации нейронной сети вы будете бороться с шаблонами. Это того не стоит.
Однако, когда у вас будет работающая реализация вашего NN, основанная на std::vector
, вы сможете ТОГДА рассмотреть его оптимизацию, которая может включать std::array
или шаблоны. Но я на 99,999% уверен, что вы останетесь с std::vector
.
Я никогда не реализовывал нейронную сеть, но провел много трудоемких симуляций. Первый выбор всегда std::vector
, и только если у кого-то есть специальные, четко определенные требования к контейнеру данных, он использует другие контейнеры.
Наконец, имейте в виду, что std::array
выделяется стеком, тогда как std::vector
выделяется в куче. Куча намного больше, и в некоторых случаях ios это важный фактор для рассмотрения.
EDIT
Вкратце:
- , если размер массива может изменяться свободно, никогда не передавайте его значение в качестве параметра шаблона. Используйте
std::vector
- Если он может принимать 2, 3, 4, возможно, 5 размеров из фиксированного набора, вы МОЖЕТЕ рассмотреть
std::array
, но std::vector
, скорее всего, будет столь же эффективным, и код будет быть проще - Если массив всегда будет иметь одинаковый размер, известный во время компиляции, и ограниченный размер стека функций не является проблемой, используйте
std::array
.