std::experimental::ranges::for_each
< 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) 按顺序,调用给定的函数对象
f
到在解引用范围 [first, last)
中的每个迭代器时调用的投影 proj
的结果(即 ranges::invoke(f, ranges::invoke(proj, *i)) )。2) 同 (1) ,但以
r
为源范围,如同以 ranges::begin(r) 为 first
并以 ranges::end(r) 为 last
。对于两个重载,若迭代器类型可变,则 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 个元素 (函数模板) |