名稱空間
變體
操作

std::for_each_n

來自 cppreference.com
< cpp‎ | 演算法
 
 
演算法庫
有約束演算法與針對範圍的演算法 (C++20)
有約束的演算法,例如 ranges::copyranges::sort 等……
執行策略 (C++17)
排序及相關操作
劃分操作
排序操作
二分搜尋操作
(於已劃分範圍上)
集合操作(於已排序範圍上)
歸併操作(於已排序範圍上)
堆操作
最小/最大值操作
(C++11)
(C++17)
字典序比較操作
排列操作
C 庫
數值操作
未初始化記憶體上的操作
 
定義於標頭檔案 <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 >
ForwardIt for_each_n( ExecutionPolicy&& policy,

                      ForwardIt first, Size n, UnaryFunc f );
(2) (C++17 起)

應用給定的函式物件 f 到範圍 [firstfirst + n) 中每個迭代器的解引用結果。如果 f 返回結果,則忽略該結果。

1) ffirst 開始按順序應用。
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 - - 應用於範圍 [firstfirst + n) 中每個迭代器的解引用結果的函式物件

函式的簽名應等效於以下內容

 void fun(const Type &a);

簽名不需要有 const &
型別  Type 必須使得 InputIt 型別的物件可以被解引用,然後隱式轉換為  Type

型別要求
-
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) 在範圍上執行迴圈[編輯]
範圍中的元素應用一元函式物件
(函式模板) [編輯]
對序列中的前 N 個元素應用函式物件
(演算法函式物件)[編輯]