Я новичок в библиотеке range-v3. Предположим, я хочу заполнить std::array
случайными числами через некоторый интервал.
С итераторами я бы сделал что-то вроде этот ответ, передав итераторы моему std::array
в качестве аргументов.
template< class Iter >
void fill_with_random_int_values( Iter start, Iter end, int min, int max)
{
static std::random_device rd; // you only need to initialize it once
static std::mt19937 mte(rd()); // this is a relative big object to create
std::uniform_int_distribution<int> dist(min, max);
std::generate(start, end, [&] () { return dist(mte); });
}
С библиотекой диапазонов я хотел использовать ranges::view::generate_n
с унарной функцией, которая генерирует одно случайное число вместе с размером моего массива.
auto random_num() -> int {
static std::mt19937 engine{std::random_device{}()};
static std::uniform_int_distribution<int> dist(1, 10);
return dist(engine);
}
std::vector<int> nums = ranges::view::generate_n(random_num, 10);
Это хорошо работает для std::vector
, но я немного не понимаю, какой алгоритм мне следует использовать для заполнения std::array
, а не для создания std::vector
, поскольку подход, аналогичный описанному выше, не работает. Я могу transform
массив и игнорировать каждый аргумент, но это не кажется правильным.