std::for_each_n
来自 cppreference.com
定义在头文件 <algorithm> 中 |
||
template< class InputIt, class Size, class UnaryFunc > InputIt for_each_n( InputIt first, Size n, UnaryFunc f ); |
(1) | (自 C++17 起) (自 C++20 起为 constexpr) |
template< class ExecutionPolicy, class ForwardIt, class Size, class UnaryFunc > |
(2) | (自 C++17 起) |
将给定的函数对象 f 应用于对范围 [
first,
first + n)
中每个迭代器解引用结果的操作。如果 f 返回结果,则忽略该结果。
1) f 从 first 开始按顺序应用。
如果
UnaryFunc
不是 可移动构造,则行为未定义。2) f 可能不会按顺序应用。算法根据 policy 执行。
此重载仅在以下情况下参与重载解析
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 起) |
如果
UnaryFunc
不是 可复制构造,则行为未定义。如果 n >= 0 不是 true,则行为未定义。
如果迭代器类型 (InputIt
/ForwardIt
) 是可变的,则 f 可以通过解引用迭代器修改范围的元素。
与其他并行算法不同,即使元素是 可平凡复制,for_each_n
也不允许复制序列中的元素。
内容 |
[编辑] 参数
first | - | 要将函数应用到的范围的起点 |
n | - | 要将函数应用到的元素数量 |
policy | - | 要使用的执行策略。有关详细信息,请参阅 执行策略。 |
f | - | 函数对象,要应用于对范围 [ first, first + n) 中每个迭代器解引用结果的操作函数的签名应等效于以下签名 void fun(const Type &a); 签名不需要具有 const &。 |
类型要求 | ||
-InputIt 必须满足 传统输入迭代器 的要求。 | ||
-ForwardIt 必须满足 传统前向迭代器 的要求。 | ||
-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; } |
[编辑] 示例
运行这段代码
#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 循环(C++11) |
在范围内执行循环 |
将一个函数应用于一个元素范围 (函数模板) | |
(C++20) |
将一个函数对象应用于序列的前 N 个元素 (niebloid) |