std::generate_n
| Определено в заголовке <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) |
g, первым count элементам в диапазоне, начиная с first, если count > 0. В противном случае ничего не делает.policy.true:
|
|
(до C++20) |
|
|
(начиная с C++20) |
Если Size не преобразуется в целочисленный тип, программа является некорректной.
Параметры
| first | - | начало диапазона элементов для генерации | ||||||
| count | - | количество генерируемых элементов | ||||||
| policy | - | политика выполнения для использования | ||||||
| g | - | функциональный объект-генератор, который будет вызываться. Сигнатура функции должна быть эквивалентна следующей:
Тип | ||||||
| Требования к типам | ||||||||
-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 элементам в диапазоне (шаблон функции & функциональный объект алгоритма) | |
(C++20) |
|
| присваивает результаты последовательных вызовов функции каждому элементу в диапазоне (шаблон функции & функциональный объект алгоритма) | |
(C++20) |
|
(C++20) |
сохраняет результат N применений функции (функциональный объект алгоритма) |