std::experimental::ranges::for_each
来自cppreference.com
< cpp | experimental | ranges
template< InputIterator I, Sentinel<I> S, class Proj = ranges::identity, IndirectUnaryInvocable<projected<I, Proj>> Fun > |
(1) | (范围 TS) |
template< InputRange R, class Proj = ranges::identity, IndirectUnaryInvocable<projected<ranges::iterator_t<R>, Proj>> Fun > |
(2) | (范围 TS) |
1) 按顺序,对范围
[
first,
last)
中的每个迭代器解引用后调用投影 proj 的结果调用给定的函数对象 f(即 ranges::invoke(f, ranges::invoke(proj, *i)))。对于两个重载,若迭代器类型可变,则 f 可以通过解引用后的迭代器修改范围的元素。若 f 返回了结果,则忽略此结果。
不同于另外的算法,不允许 for_each
复制序列中的元素,即使它们为可平凡复制。
不同于 std::for_each(它只要求可移动构造 (MoveConstructible) ),这些函数要求 Fun
实现 CopyConstructible
。
尽管声明描述如上,算法声明的模板形参的实际数量和顺序是未指定的。从而若在调用算法时使用显式模板实参,则程序很可能不可移植。
参数
first, last | - | 要应用函数的范围 |
r | - | 要应用函数的范围 |
f | - | 应用到每个投射后的范围中元素的可调用对象 |
proj | - | 应用到元素的投射 |
返回值
含有下列两个成员的 tagged_pair
:
- 第一成员带标签
tag::in
,是源范围的尾后迭代器(即比较等于哨位 last 的I
类型的迭代器)。 - 第二成员带标签
tag::fun
,(在该函数对象的所有应用后)从std::move(f)
初始化。
复杂度
恰好应用 last - first 次 f 和 proj。
可能的实现
template<InputIterator I, Sentinel<I> S, class Proj = ranges::identity, IndirectUnaryInvocable<ranges::projected<I, Proj>> Fun> auto for_each(I first, S last, Fun f, Proj proj = Proj{}) -> ranges::tagged_pair<tag::in(I), tag::fun(Fun)> { for (; first != last; ++first) ranges::invoke(f, ranges::invoke(proj, *first)); return {std::move(first), std::move(f)}; } |
示例
本节未完成 原因:暂无示例 |
参阅
应用一个函数到元素范围 (函数模板) | |
范围 for 循环(C++11)
|
执行范围上的循环 |
应用函数到范围中的元素 (函数模板) | |
(C++17) |
应用一个函数对象到序列的前 n 个元素 (函数模板) |