std::experimental::ranges::for_each
來自 cppreference.com
< cpp | experimental | ranges
定義於標頭檔案 <experimental/ranges/algorithm> |
||
template< InputIterator I, Sentinel<I> S, class Proj = ranges::identity, IndirectUnaryInvocable<projected<I, Proj>> Fun > |
(1) | (ranges TS) |
template< InputRange R, class Proj = ranges::identity, IndirectUnaryInvocable<projected<ranges::iterator_t<R>, Proj>> Fun > |
(2) | (ranges TS) |
1) 對範圍
[
first,
last)
中解引用每個迭代器的結果(即 ranges::invoke(f, ranges::invoke(proj, *i)))按順序呼叫給定函式物件 f,並應用投影 proj。對於兩個過載,如果迭代器型別是可變的,則 f 可以透過解引用迭代器修改範圍的元素。如果 f 返回結果,則該結果被忽略。
與其餘演算法不同,即使序列中的元素是可平凡複製的,也不允許 for_each 複製它們。
與 std::for_each(僅要求 MoveConstructible)不同,這些函式要求 Fun
模擬 CopyConstructible
。
儘管上述宣告所示,演算法宣告的實際模板引數數量和順序未指定。因此,如果在呼叫演算法時使用顯式模板引數,程式可能不可移植。
目錄 |
[編輯] 引數
first, last | - | 要應用函式的範圍 |
r | - | 要應用函式的範圍 |
f | - | 要應用於範圍內每個投影元素的的可呼叫物件 |
proj | - | 應用於元素的投影 |
[編輯] 返回值
一個 tagged_pair
物件,包含以下兩個成員
- 第一個成員,帶有標籤
tag::in
,是源範圍的結束迭代器(即型別為I
且與哨兵 last 比較相等的迭代器)。 - 第二個成員,帶有標籤
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)}; } |
[編輯] 示例
本節不完整 原因:無示例 |
[編輯] 另請參閱
對一個範圍的元素應用函式 (函式模板) | |
range-for 迴圈(C++11) |
對範圍執行迴圈 |
對範圍中的元素應用一元函式物件 (函式模板) | |
(C++17) |
對序列中的前 N 個元素應用函式物件 (函式模板) |