名稱空間
變體
操作

std::generate_n

來自 cppreference.com
< cpp‎ | 演算法
 
 
演算法庫
有約束演算法與針對範圍的演算法 (C++20)
有約束的演算法,例如 ranges::copyranges::sort 等……
執行策略 (C++17)
排序及相關操作
劃分操作
排序操作
二分搜尋操作
(於已劃分範圍上)
集合操作(於已排序範圍上)
歸併操作(於已排序範圍上)
堆操作
最小/最大值操作
(C++11)
(C++17)
字典序比較操作
排列操作
C 庫
數值操作
未初始化記憶體上的操作
 
定義於標頭檔案 <algorithm>
template< class OutputIt, class Size, class Generator >
OutputIt generate_n( OutputIt first, Size count, Generator g );
(1) (C++20 起為 constexpr)
template< class ExecutionPolicy,

          class ForwardIt, class Size, class Generator >
ForwardIt generate_n( ExecutionPolicy&& policy,

                      ForwardIt first, Size count, Generator g );
(2) (C++17 起)
1) 將給定函式物件 g 生成的值賦值給起始於 first 的範圍內的前 count 個元素,如果 count > 0。否則不執行任何操作。
2)(1),但根據 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 起)

如果 Size 不可轉換為整數型別,則程式格式錯誤。

目錄

[編輯] 引數

first - 生成元素的範圍起始
count - 要生成的元素數量
policy - 要使用的 執行策略
g - 將要呼叫的生成器函式物件。

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

Ret fun();

型別 Ret 必須使得型別為 OutputIt 的物件可以被解引用並賦值為型別 Ret 的值。

型別要求
-
OutputIt 必須滿足 LegacyOutputIterator 的要求。
-
ForwardIt 必須滿足 LegacyForwardIterator 的要求。

[編輯] 返回值

如果 count > 0,則返回最後一個賦值元素之後的一個迭代器,否則返回 first

[編輯] 複雜度

精確呼叫 g() 並賦值 std::max(0, count) 次。

[編輯] 異常

帶有名為 ExecutionPolicy 的模板引數的過載會按如下方式報告錯誤:

  • 如果作為演算法一部分呼叫的函式的執行丟擲異常,且 ExecutionPolicy標準策略之一,則呼叫 std::terminate。對於任何其他 ExecutionPolicy,行為是實現定義的。
  • 如果演算法未能分配記憶體,則丟擲 std::bad_alloc

[編輯] 可能的實現

template<class OutputIt, class Size, class Generator>
constexpr // since C++20
OutputIt generate_n(OutputIt first, Size count, Generator g)
{
    for (Size i = 0; i < count; ++i, ++first)
        *first = g();
 
    return first;
}

[編輯] 示例

#include <algorithm>
#include <functional>
#include <iostream>
#include <iterator>
#include <random>
 
int main()
{
    std::mt19937 rng; // default constructed, seeded with fixed seed
    std::generate_n(std::ostream_iterator<std::mt19937::result_type>(std::cout, " "),
                    5, std::ref(rng));
    std::cout << '\n';
}

輸出

3499211612 581869302 3890346734 3586334585 545404204

[編輯] 缺陷報告

下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。

缺陷報告 應用於 釋出時的行為 正確的行為
LWG 426 C++98 複雜度要求是“精確呼叫 count
或賦值”,如果 count 為負數,則此要求不成立
不呼叫或不賦值
如果 count 非正
LWG 865 C++98 未返回填充範圍後第一個元素的位置
未返回生成範圍
已返回

[編輯] 參閱

將給定值複製賦給一個範圍中的 N 個元素
(函式模板) [編輯]
將連續函式呼叫的結果賦給一個範圍中的每個元素
(函式模板) [編輯]
儲存 N 次應用一個函式的結果
(演算法函式物件)[編輯]