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 | - | функциональный объект, применяемый к элементам Сигнатура функции должна быть эквивалентна следующей:
Сигнатура не обязательно должна содержать |
| policy | - | используемая политика выполнения |
| Требования к типам | ||
-InputIt должен соответствовать требованиям LegacyInputIterator.
| ||
-ForwardIt должен соответствовать требованиям LegacyForwardIterator.
| ||
-Size должен быть преобразуемым в целочисленный тип.
| ||
Возвращаемое значение
std::next(first, count)
Сложность
Ровно count применений f.
Исключения
- Если временные ресурсы памяти, необходимые для распараллеливания, недоступны, генерируется std::bad_alloc.
- Если при доступе к объектам через аргумент алгоритма выбрасывается неперехваченное исключение, поведение определяется политикой выполнения (для стандартных политик вызывается std::terminate).
Примечания
Если тип итератора (InputIt/ForwardIt) изменяемый, f может изменять элементы в целевом диапазоне.
Возможная реализация
См. также реализацию в libstdc++, libc++ и MSVC stdlib.
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 цикл(C++11)
|
выполняет цикл по диапазону |