跳到主要内容

std::for_each_n() 算法

// (1)
template< class InputIt, class Size, class UnaryFunction >
constexpr InputIt for_each_n( InputIt first, Size n, UnaryFunction f );

// (2)
template< class ExecutionPolicy, class ForwardIt, class Size, class UnaryFunction2 >
ForwardIt for_each_n( ExecutionPolicy&& policy,
ForwardIt first, Size n, UnaryFunction2 f );

将给定函数应用于由迭代器和大小定义的范围内的所有元素。

  • (1) 将给定函数对象 f 按顺序应用于范围 [first, first + n) 中每个迭代器解引用的结果。

  • (2)(1),但根据策略执行。

    警告

    不保证函数会按顺序应用于元素。

    重载决议

    这些重载只有在 std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>  (直到 C++20) std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>  (自 C++20 起)true 时才参与重载决议。

对于这两个重载,如果迭代器类型 (InputIt/ForwardIt) 是可变的,f 可以修改范围的元素。如果 f 返回一个结果,该结果将被忽略。

警告

与并行算法的其他部分不同,for_each_n 不允许复制序列中的元素,即使它们是TriviallyCopyable

未定义行为

如果 n 小于零,则行为未定义

.

参数

first

要应用函数的范围的开始。

n

要应用函数的元素数量。

policy

要使用的执行策略。有关详细信息,请参阅执行策略

f

函数对象,将应用于范围的每个元素。

函数的签名应与以下内容等效

void fun(const Type& a);
  • 签名不需要包含 const&
  • 类型 Type 必须是这样的,即 InputIt 类型的对象可以被解引用,然后隐式转换为 Type

类型要求

InputItLegacyInputIterator
ForwardItLegacyForwardIterator
UnaryFunctionMoveConstructible
UnaryFunction2CopyConstructible

返回值

一个迭代器,等于 first + n,或更正式地,等于 std::advance(first, n)

复杂度

精确地 nf 的应用。

异常

带有模板参数 ExecutionPolicy 的重载报告错误如下

  • 如果作为算法一部分调用的函数在执行过程中抛出异常且 ExecutionPolicy标准策略之一,则调用std::terminate。对于任何其他 ExecutionPolicy,行为是实现定义的.
  • 如果算法未能分配内存,则抛出 std::bad_alloc

可能的实现

for_each_n (1)
template<class InputIt, class Size, class UnaryFunction>
InputIt for_each_n(InputIt first, Size n, UnaryFunction f)
{
for (Size i = 0; i < n; ++first, (void) ++i)
f(*first);

return first;
}

示例

Main.cpp
#include <algorithm>
#include <iostream>
#include <vector>

void println(auto const& v)
{
for (auto count{v.size()}; auto const& 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
本文源自此 CppReference 页面。它可能经过修改以进行改进或适应编辑者的偏好。单击“编辑此页面”可查看本文档的所有更改。
悬停查看原始许可证。

std::for_each_n() 算法

// (1)
template< class InputIt, class Size, class UnaryFunction >
constexpr InputIt for_each_n( InputIt first, Size n, UnaryFunction f );

// (2)
template< class ExecutionPolicy, class ForwardIt, class Size, class UnaryFunction2 >
ForwardIt for_each_n( ExecutionPolicy&& policy,
ForwardIt first, Size n, UnaryFunction2 f );

将给定函数应用于由迭代器和大小定义的范围内的所有元素。

  • (1) 将给定函数对象 f 按顺序应用于范围 [first, first + n) 中每个迭代器解引用的结果。

  • (2)(1),但根据策略执行。

    警告

    不保证函数会按顺序应用于元素。

    重载决议

    这些重载只有在 std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>  (直到 C++20) std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>  (自 C++20 起)true 时才参与重载决议。

对于这两个重载,如果迭代器类型 (InputIt/ForwardIt) 是可变的,f 可以修改范围的元素。如果 f 返回一个结果,该结果将被忽略。

警告

与并行算法的其他部分不同,for_each_n 不允许复制序列中的元素,即使它们是TriviallyCopyable

未定义行为

如果 n 小于零,则行为未定义

.

参数

first

要应用函数的范围的开始。

n

要应用函数的元素数量。

policy

要使用的执行策略。有关详细信息,请参阅执行策略

f

函数对象,将应用于范围的每个元素。

函数的签名应与以下内容等效

void fun(const Type& a);
  • 签名不需要包含 const&
  • 类型 Type 必须是这样的,即 InputIt 类型的对象可以被解引用,然后隐式转换为 Type

类型要求

InputItLegacyInputIterator
ForwardItLegacyForwardIterator
UnaryFunctionMoveConstructible
UnaryFunction2CopyConstructible

返回值

一个迭代器,等于 first + n,或更正式地,等于 std::advance(first, n)

复杂度

精确地 nf 的应用。

异常

带有模板参数 ExecutionPolicy 的重载报告错误如下

  • 如果作为算法一部分调用的函数在执行过程中抛出异常且 ExecutionPolicy标准策略之一,则调用std::terminate。对于任何其他 ExecutionPolicy,行为是实现定义的.
  • 如果算法未能分配内存,则抛出 std::bad_alloc

可能的实现

for_each_n (1)
template<class InputIt, class Size, class UnaryFunction>
InputIt for_each_n(InputIt first, Size n, UnaryFunction f)
{
for (Size i = 0; i < n; ++first, (void) ++i)
f(*first);

return first;
}

示例

Main.cpp
#include <algorithm>
#include <iostream>
#include <vector>

void println(auto const& v)
{
for (auto count{v.size()}; auto const& 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
本文源自此 CppReference 页面。它可能经过修改以进行改进或适应编辑者的偏好。单击“编辑此页面”可查看本文档的所有更改。
悬停查看原始许可证。