std::generate_n

出自cppreference.com
 
 
算法庫
受約束算法及範圍上的算法 (C++20)
包含算法例如 ranges::copy, ranges::sort, ...
執行策略 (C++17)
排序和相關操作
劃分操作
排序操作
二分搜索操作(在已劃分範圍上)
集合操作(在有序範圍上)
歸併操作(在有序範圍上)
堆操作
最小/最大操作
(C++11)
(C++17)
字典序比較操作
排列操作
C 庫

數值運算
(C++11)                       
在未初始化內存上的操作
 
在標頭 <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) 如果 count > 0,則將給定函數對象 g 所生成的值對始於 first 的範圍的前 count 個元素賦值。否則什麼也不做。
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 // C++20 起
OutputIt generate_n(OutputIt first, Size count, Generator g)
{
    for (Size i = 0; i < count; ++i)
        *first++ = g();
    
    return first;
}

示例

#include <algorithm>
#include <functional>
#include <iostream>
#include <iterator>
#include <random>
 
int main()
{
    std::mt19937 rng; // 默认构造,使用固定的种子
    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 次函數應用的結果
(算法函數對象) [編輯]