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) 按顺序,调用给定的函数对象
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 个元素 (函数模板) |