Namespaces
Variants

std:: generate_n

From cppreference.net
Algorithm library
Constrained algorithms and algorithms on ranges (C++20)
Constrained algorithms, e.g. ranges::copy , ranges::sort , ...
Execution policies (C++17)
Non-modifying sequence operations
Batch operations
(C++17)
Search operations
Modifying sequence operations
Copy operations
(C++11)
(C++11)
Swap operations
Transformation operations
Generation operations
generate_n
Removing operations
Order-changing operations
(until C++17) (C++11)
(C++20) (C++20)
Sampling operations
(C++17)

Sorting and related operations
Partitioning operations
Sorting operations
Binary search operations
(on partitioned ranges)
Set operations (on sorted ranges)
Merge operations (on sorted ranges)
Heap operations
Minimum/maximum operations
Lexicographical comparison operations
Permutation operations
C library
Numeric operations
Operations on uninitialized memory
Определено в заголовочном файле <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 .
Эта перегрузка участвует в разрешении перегрузки только при выполнении всех следующих условий:

std:: is_execution_policy_v < std:: decay_t < ExecutionPolicy >> равно true .

(до C++20)

std:: is_execution_policy_v < std:: remove_cvref_t < ExecutionPolicy >> равно true .

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

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

Содержание

Параметры

first - начало диапазона элементов для генерации
count - количество генерируемых элементов
policy - политика выполнения, которая будет использоваться execution policy to use
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 // начиная с 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; // конструктор по умолчанию, заполнен фиксированным зерном
    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 применений функции
(функциональный объект алгоритма)