std::for_each_n
Определён в заголовочном файле <algorithm> | ||
|---|---|---|
template< class InputIt, class Size, class UnaryFunc > InputIt for_each_n( InputIt first, Size count, UnaryFunc f ); | (1) | (constexpr с C++20) |
template< class ExecutionPolicy,
class ForwardIt, class Size, class UnaryFunc >
ForwardIt for_each_n( ExecutionPolicy&& policy,
ForwardIt first, Size count, UnaryFunc f );
| (2) | (начиная с C++17) |
Применяет заданный вызываемый объект f к каждому элементу целевого диапазона [first, std::next(first, count)). Если f возвращает результат, он игнорируется.
f применяется по порядку, начиная с first.UnaryFunc не является MoveConstructible, поведение не определено.f может применяться не по порядку. Алгоритм выполняется в соответствии с policy.for_each_n не может создавать произвольные копии элементов целевого диапазона.true: |
| (до C++20) |
|
| (начиная с C++20) |
UnaryFunc не является CopyConstructible, поведение не определено.Если count >= 0 не является true, поведение не определено.
Параметры
| first | - | начало целевого диапазона |
| count | - | количество элементов в целевом диапазоне |
| f | - | функциональный объект, применяемый к элементам Сигнатура функции должна быть эквивалентна следующей: voidfun(constType&a); Сигнатура не обязана содержать |
| policy | - | политика выполнения, которую следует использовать |
| Требования к типам | ||
-InputIt должен удовлетворять требованиям LegacyInputIterator. |
||
-ForwardIt должен удовлетворять требованиям LegacyForwardIterator. |
||
-Size должен преобразовываться к целочисленному типу. |
||
Возвращаемое значение
std::next(first, count)
Сложность
Ровно count применений f.
Исключения
2) В процессе выполнения:- Если требуемые для распараллеливания временные ресурсы памяти недоступны, выбрасывается
std::bad_alloc. - Если при обращении к объектам через аргумент алгоритма возникает неперехваченное исключение, поведение определяется политикой выполнения (для стандартных политик вызывается
std::terminate).
Примечания
Если тип итератора (InputIt/ForwardIt) допускает изменение, f может изменять элементы целевого диапазона.
Возможная реализация
См. также реализацию в libstdc++, libc++ и стандартной библиотеке MSVC.
template<class InputIt, class Size, class UnaryFunc>
InputIt for_each_n(InputIt first, Size count, UnaryFunc f)
{
for (Size i = 0; i < count; ++first, (void) ++i)
f(*first);
return first;
}
|
Пример
#include <algorithm>
#include <iostream>
#include <vector>
void println(const auto& v)
{
for (auto count{v.size()}; const auto& e : v)
std::cout << e << (--count ? ", " : "\n");
}
int main()
{
std::vector<int> vi{1, 2, 3, 4, 5};
println(vi);
std::for_each_n(vi.begin(), 3, [](auto& n) { n *= 2; });
println(vi);
}
Вывод:
1, 2, 3, 4, 5 2, 4, 6, 4, 5
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены задним числом к ранее опубликованным стандартам C++.
| DR | Применён к | Опубликованное поведение | Корректное поведение |
|---|---|---|---|
|
LWG 3213 (P1718R2) | C++17 |
Size не требовалось преобразовывать к целочисленному типу | требуется |
См. также
|
(C++20) | применяет функциональный объект к первым N элементам последовательности (функциональный объект-алгоритм) |
| применяет унарный функциональный объект к элементам диапазона (шаблон функции и функциональный объект-алгоритм) |
|
|
(C++20) | |
| применяет функцию к диапазону элементов, сохраняя результаты в целевом диапазоне (шаблон функции и функциональный объект-алгоритм) |
|
|
(C++20) | |
цикл for для диапазона-for(C++11) | выполняет цикл по диапазону |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/algorithm/for_each_n