Spec-Zone.ru › C++

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

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 - функциональный объект, применяемый к элементам

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

voidfun(constType&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.

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 не требовалось преобразовывать к целочисленному типу требуется

См. также

ranges::for_each_n
(C++20)
применяет функциональный объект к первым N элементам последовательности
(функциональный объект-алгоритм)
for_each
применяет унарный функциональный объект к элементам диапазона
(шаблон функции и функциональный объект-алгоритм)
ranges::for_each
(C++20)
transform
применяет функцию к диапазону элементов, сохраняя результаты в целевом диапазоне
(шаблон функции и функциональный объект-алгоритм)
ranges::transform
(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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API