std::for_each_n
來自 cppreference.com
定義於標頭檔案 <algorithm> |
||
template< class InputIt, class Size, class UnaryFunc > InputIt for_each_n( InputIt first, Size n, UnaryFunc f ); |
(1) | (C++17 起) (C++20 起為 constexpr) |
template< class ExecutionPolicy, class ForwardIt, class Size, class UnaryFunc > |
(2) | (C++17 起) |
應用給定的函式物件 f 到範圍 [
first,
first + n)
中每個迭代器的解引用結果。如果 f 返回結果,則忽略該結果。
1) f 從 first 開始按順序應用。
若
UnaryFunc
不是可移動構造 (MoveConstructible),則行為未定義。2) f 可能不按順序應用。演算法根據 policy 執行。
僅當滿足以下所有條件時,此過載才參與過載決議
std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> 為 true。 |
(C++20 前) |
std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>> 為 true。 |
(C++20 起) |
若
UnaryFunc
不是可複製構造 (CopyConstructible),則行為未定義。若 n >= 0 不為 true,則行為未定義。
如果迭代器型別 (InputIt
/ForwardIt
) 是可變的,f 可以透過解引用的迭代器修改範圍中的元素。
與其他並行演算法不同,for_each_n
不允許對序列中的元素進行復制,即使它們是可平凡複製 (TriviallyCopyable)的。
目錄 |
[編輯] 引數
first | - | - 要應用函式的範圍的起始 |
n | - | - 要應用函式的元素數量 |
policy | - | 要使用的 執行策略 |
f | - | - 應用於範圍 [ first, first + n) 中每個迭代器的解引用結果的函式物件函式的簽名應等效於以下內容 void fun(const Type &a); 簽名不需要有 const &。 |
型別要求 | ||
-InputIt 必須滿足 LegacyInputIterator 的要求。 | ||
-ForwardIt 必須滿足 LegacyForwardIterator 的要求。 | ||
-Size 必須可轉換為整數型別。 |
[編輯] 返回值
一個等於 first + n 的迭代器,或者更正式地說,等於 std::advance(first, n)。
[編輯] 複雜度
恰好 n 次應用 f。
[編輯] 異常
帶有名為 ExecutionPolicy
的模板引數的過載會按如下方式報告錯誤:
- 若作為演算法一部分呼叫的函式的執行丟擲異常,且
ExecutionPolicy
是標準策略之一,則呼叫 std::terminate。對於任何其他ExecutionPolicy
,行為是實現定義的。 - 如果演算法未能分配記憶體,則丟擲 std::bad_alloc。
[編輯] 可能的實現
亦見 libstdc++、libc++ 和 MSVC stdlib 中的實現。
template<class InputIt, class Size, class UnaryFunc> InputIt for_each_n(InputIt first, Size n, UnaryFunc f) { for (Size i = 0; i < n; ++first, (void) ++i) f(*first); return first; } |
[編輯] 示例
執行此程式碼
#include <algorithm> #include <iostream> #include <vector> void println(auto const& v) { for (auto count{v.size()}; const auto& e : v) std::cout << e << (--count ? ", " : "\n"); } int main() { std::vector<int> vi{1, 2, 3, 4, 5}; println(vi); std::for_each_n(vi.begin(), 3, [](auto& n) { n *= 2; }); println(vi); }
輸出
1, 2, 3, 4, 5 2, 4, 6, 4, 5
[編輯] 參閱
對一個範圍的元素應用函式,並將結果儲存在目標範圍中 (函式模板) | |
range-for 迴圈(C++11) |
在範圍上執行迴圈 |
對範圍中的元素應用一元函式物件 (函式模板) | |
(C++20) |
對序列中的前 N 個元素應用函式物件 (演算法函式物件) |