Namespaces
Variants

std::for_each_n

С ru.cppreference.net
 
 
Библиотека алгоритмов
Ограниченные алгоритмы и алгоритмы на диапазонах (C++20)
Ограниченные алгоритмы, например, ranges::copy, ranges::sort, ...
Неизменяющие операции над последовательностями    
Пакетные операции
(C++17)
Операции поиска
Изменяющие операции над последовательностями
Операции копирования
(C++11)
(C++11)
Операции обмена
Операции преобразования
Операции генерации
Операции удаления
Операции изменения порядка
(до C++17)(C++11)
(C++20)(C++20)
Операции выборки
(C++17)

Сортировка и связанные операции
Операции разделения
(C++11)    

Операции сортировки
Операции бинарного поиска
(на разделённых диапазонах)
Операции над множествами (на отсортированных диапазонах)
Операции слияния (на отсортированных диапазонах)
Операции с кучей
Операции поиска минимума/максимума
(C++11)
(C++17)
Операции лексикографического сравнения
Операции перестановок


Политики выполнения (C++17)
(только для пояснения*)(C++26)

Числовые операции
(C++11)
(C++17)
(C++17)    

Специализированные <memory> алгоритмы

Специализированные <random> алгоритмы
Библиотека C









 
Определён в заголовке <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 возвращает результат, этот результат игнорируется.

1) f применяется по порядку, начиная с first.
Если UnaryFunc не является MoveConstructible, поведение не определено.
2) f может применяться не по порядку. Алгоритм выполняется в соответствии с policy.
В отличие от других параллельных алгоритмов, for_each_n не допускается произвольное копирование элементов из целевого диапазона.
Эта перегрузка участвует в разрешении перегрузки только если значение следующего выражения равно true:

std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>

(до C++20)

std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>

(начиная с C++20)
Если UnaryFunc не является CopyConstructible, поведение не определено.

Если count >= 0 не является true, поведение не определено.

Параметры

first - начало целевого диапазона
count - количество элементов в целевом диапазоне
f - функциональный объект, применяемый к элементам

Сигнатура функции должна быть эквивалентна следующей:

void fun(const Type &a);

Сигнатура не обязательно должна содержать const &.
Тип Type должен быть таким, чтобы объект типа InputIt можно было разыменовать и затем неявно преобразовать в Type.

​

policy - используемая политика выполнения
Требования к типам
-
InputIt должен соответствовать требованиям LegacyInputIterator.
-
ForwardIt должен соответствовать требованиям LegacyForwardIterator.
-
Size должен быть преобразуемым в целочисленный тип.

Возвращаемое значение

std::next(first, count)

Сложность

Ровно count применений f.

Исключения

2) Во время выполнения:
  • Если временные ресурсы памяти, необходимые для распараллеливания, недоступны, генерируется 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 не требовалось быть преобразуемым в целочисленный тип требуется

См. также

применяет функциональный объект к первым N элементам последовательности
(алгоритмический функциональный объект)
применяет унарный функциональный объект к элементам из диапазона
(шаблон функции & алгоритмический функциональный объект)
применяет функцию к диапазону элементов, сохраняя результаты в целевом диапазоне
(шаблон функции & алгоритмический функциональный объект)
диапазонный-for цикл(C++11) выполняет цикл по диапазону