std:: for_each_n
|
Определено в заголовочном файле
<algorithm>
|
||
|
template
<
class
InputIt,
class
Size,
class
UnaryFunc
>
InputIt for_each_n ( InputIt first, Size n, UnaryFunc f ) ; |
(1) |
(начиная с C++17)
(constexpr начиная с C++20) |
|
template
<
class
ExecutionPolicy,
class
ForwardIt,
class
Size,
class
UnaryFunc
>
|
(2) | (начиная с C++17) |
Применяет заданный функциональный объект
f
к результату разыменования каждого итератора в диапазоне
[
first
,
first
+
n
)
. Если
f
возвращает результат, он игнорируется.
|
std:: is_execution_policy_v < std:: decay_t < ExecutionPolicy >> равно true . |
(до C++20) |
|
std:: is_execution_policy_v < std:: remove_cvref_t < ExecutionPolicy >> равно true . |
(начиная с C++20) |
Если n >= 0 не является true , поведение не определено.
Если тип итератора (
InputIt
/
ForwardIt
) является изменяемым,
f
может изменять элементы диапазона через разыменованный итератор.
В отличие от остальных параллельных алгоритмов,
for_each_n
не разрешено создавать копии элементов в последовательности, даже если они являются
TriviallyCopyable
.
Содержание |
Параметры
| first | - | начало диапазона, к которому применяется функция |
| n | - | количество элементов, к которым применяется функция |
| policy | - | политика выполнения, которая будет использоваться execution policy to use |
| f | - |
функциональный объект, применяемый к результату разыменования каждого итератора в диапазоне
[
first
,
first
+
n
)
Сигнатура функции должна быть эквивалентна следующей: void fun ( const Type & a ) ;
Сигнатура не обязательно должна содержать
const
&
.
|
| Требования к типам | ||
-
InputIt
должен удовлетворять требованиям
LegacyInputIterator
.
|
||
-
ForwardIt
должен удовлетворять требованиям
LegacyForwardIterator
.
|
||
-
Size
должен быть конвертируемым в целочисленный тип.
|
||
Возвращаемое значение
Итератор, равный first + n , или, более формально, std:: advance ( first, n ) .
Сложность
Ровно n применений функции f .
Исключения
Перегрузка с параметром шаблона с именем
ExecutionPolicy
сообщает об ошибках следующим образом:
-
Если выполнение функции, вызванной как часть алгоритма, выбрасывает исключение и
ExecutionPolicyявляется одним из стандартных политик , std::terminate вызывается. Для любой другойExecutionPolicyповедение определяется реализацией. - Если алгоритму не удается выделить память, std::bad_alloc выбрасывается.
Возможная реализация
Смотрите также реализацию в libstdc++ , libc++ и MSVC stdlib .
template<class InputIt, class Size, class UnaryFunc> InputIt for_each_n(InputIt first, Size n, UnaryFunc f) { for (Size i = 0; i < n; ++first, (void) ++i) f(*first); return first; } |
` и `` оставлен без изменений в соответствии с требованиями. HTML-разметка и атрибуты также сохранены в оригинальном виде.
Пример
#include <algorithm> #include <iostream> #include <vector> void println(auto const& 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
Смотрите также
|
применяет функцию к диапазону элементов, сохраняя результаты в целевом диапазоне
(шаблон функции) |
|
range-
for
loop
(C++11)
|
выполняет цикл по диапазону |
|
применяет унарный
function object
к элементам из
range
(шаблон функции) |
|
|
(C++20)
|
применяет объект функции к первым N элементам последовательности
(объект функции алгоритма) |