Namespaces
Variants

std::generate_n

От ru.cppreference.net
 
 
Библиотека алгоритмов
Ограниченные алгоритмы и алгоритмы над диапазонами (C++20)
Ограниченные алгоритмы, например ranges::copy, ranges::sort, ...
Немодифицирующие операции над последовательностями    
Пакетные операции
(C++17)
Операции поиска
Модифицирующие операции над последовательностями
Операции копирования
(C++11)
(C++11)
Операции обмена
Операции преобразования
Операции генерации
Операции удаления
Операции изменения порядка
(до C++17)(C++11)
(C++20)(C++20)
Операции выборки
(C++17)

Сортировка и связанные операции
Операции разбиения
(C++11)    

Операции сортировки
Операции бинарного поиска
(на разбитых диапазонах)
Операции над множествами (на сортированных диапазонах)
Операции слияния (на сортированных диапазонах)
Операции с кучей
Операции поиска минимума/максимума
(C++11)
(C++17)
Операции лексикографического сравнения
Операции перестановок


Политики выполнения (C++17)
(только для демонстрации*)(C++26)

Численные операции
(C++11)
(C++17)
(C++17)    

Специализированные <memory> алгоритмы

Специализированные <random> алгоритмы
Библиотека C









 
Определено в заголовке <algorithm>
template< class OutputIt, class Size, class Generator >
OutputIt generate_n( OutputIt first, Size count, Generator g );
(1) (constexpr начиная с C++20)
template< class ExecutionPolicy,
          class ForwardIt, class Size, class Generator >
ForwardIt generate_n( ExecutionPolicy&& policy,
                      ForwardIt first, Size count, Generator g );
(2) (начиная с C++17)
1) Присваивает значения, генерируемые заданным функциональным объектом g, первым count элементам в диапазоне, начиная с first, если count > 0. В противном случае ничего не делает.
2) То же, что и (1), но выполняется в соответствии с policy.
Эта перегрузка участвует в разрешении перегрузки только если значение следующего выражения равно true:

std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>

(до C++20)

std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>

(начиная с C++20)

Если Size не преобразуется в целочисленный тип, программа является некорректной.

Параметры

first - начало диапазона элементов для генерации
count - количество генерируемых элементов
policy - политика выполнения для использования
g - функциональный объект-генератор, который будет вызываться.

Сигнатура функции должна быть эквивалентна следующей:

Ret fun();

Тип Ret должен быть таким, чтобы объект типа OutputIt можно было разыменовать и присвоить значение типа Ret. ​

Требования к типам
-
OutputIt должен удовлетворять требованиям LegacyOutputIterator.
-
ForwardIt должен удовлетворять требованиям LegacyForwardIterator.

Возвращаемое значение

Итератор, указывающий на элемент, следующий за последним присвоенным, если count > 0, в противном случае first.

Сложность

Ровно std::max(0, count) вызовов g() и присваиваний.

Исключения

Перегрузка с параметром шаблона с именем ExecutionPolicy сообщает об ошибках следующим образом:

  • Если выполнение функции, вызванной в рамках алгоритма, генерирует исключение и ExecutionPolicy является одной из стандартных политик, вызывается std::terminate. Для любой другой ExecutionPolicy поведение определяется реализацией.
  • Если алгоритму не удаётся выделить память, генерируется std::bad_alloc.

Возможная реализация

template<class OutputIt, class Size, class Generator>
constexpr // since C++20
OutputIt generate_n(OutputIt first, Size count, Generator g)
{
    for (Size i = 0; i < count; ++i, ++first)
        *first = g();
    
    return first;
}

Пример

#include <algorithm>
#include <functional>
#include <iostream>
#include <iterator>
#include <random>

int main()
{
    std::mt19937 rng; // default constructed, seeded with fixed seed
    std::generate_n(std::ostream_iterator<std::mt19937::result_type>(std::cout, " "),
                    5, std::ref(rng));
    std::cout << '\n';
}

Вывод:

3499211612 581869302 3890346734 3586334585 545404204

Отчёты о дефектах

Следующие отчёты о дефектах, изменяющих поведение, были применены задним числом к ранее опубликованным стандартам C++.

DR Применён к Поведение в опубликованном виде Корректное поведение
LWG 426 C++98 требование к сложности было «ровно count вызовов
или присваиваний», что некорректно, если count отрицательно
ни одного вызова или присваивания
если count неположительно
LWG 865 C++98 местоположение первого элемента после
диапазона генерации не возвращалось
возвращается

Смотри также

копирует присваиванием заданное значение N элементам в диапазоне
(шаблон функции & функциональный объект алгоритма)
присваивает результаты последовательных вызовов функции каждому элементу в диапазоне
(шаблон функции & функциональный объект алгоритма)
сохраняет результат N применений функции
(функциональный объект алгоритма)