std::experimental::ranges::for_each

来自cppreference.com
< cpp‎ | experimental‎ | ranges
 
 
技术规范
文件系统库 (文件系统 TS)
库基础 (库基础 TS)
库基础 2 (库基础 TS v2)
库基础 3 (库基础 TS v3)
并行扩展 (并行 TS)
并行扩展 2 (并行 TS v2)
并发扩展 (并发 TS)
并发扩展 2 (并发 TS v2)
概念 (概念 TS)
范围 (范围 TS)
反射 (反射 TS)
数学特殊函数 (特殊函数 TR)
 
 
 
template< InputIterator I, Sentinel<I> S, class Proj = ranges::identity,

          IndirectUnaryInvocable<projected<I, Proj>> Fun >
ranges::tagged_pair<tag::in(I), tag::fun(Fun)>

  for_each(I first, S last, Fun f, Proj proj = Proj{});
(1) (范围 TS)
template< InputRange R, class Proj = ranges::identity,

          IndirectUnaryInvocable<projected<ranges::iterator_t<R>, Proj>> Fun >
ranges::tagged_pair<tag::in(ranges::safe_iterator_t<R>), tag::fun(Fun)>

  for_each(R&& r, Fun f, Proj proj = Proj{});
(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 ,是源范围的尾后迭代器(即比较等于哨位 lastI 类型迭代器)。
  • 第二成员带标签 tag::fun ,(在该函数对象的所有应用后)从 std::move(f) 初始化。

复杂度

准确应用 last - firstfproj

可能的实现

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) 执行范围上的循环
应用函数到范围中的元素
(函数模板)
应用一个函数对象到序列的前 n 个元素
(函数模板)