std::generate_n
Определено в заголовке <algorithm> | ||
|---|---|---|
| (1) | ||
template< class OutputIt, class Size, class Generator > OutputIt generate_n( OutputIt first, Size count, Generator g ); | (до C++20) | |
template< class OutputIt, class Size, class Generator > constexpr OutputIt generate_n( OutputIt first, Size count, Generator g ); | (с 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. Этот перегруз не участвует в разрешении перегрузки, если |
| (до C++20) |
|
| (с C++20) |
Параметры
| 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) | сохраняет результат N применений функции (niebloid) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/algorithm/generate_n