std::generate_n
出自cppreference.com
| 在標頭 <algorithm> 定義
|
||
| |
(1) | (C++20 起為 constexpr) |
| |
(2) | (C++17 起) |
1) 如果
count > 0,則將給定函數對象 g 所生成的值對始於 first 的範圍的前 count 個元素賦值。否則什麼也不做。2) 同 (1),但按照
policy 執行。 此重載只有在滿足以下所有條件時才會參與重載決議:
|
|
(C++20 前) |
|
|
(C++20 起) |
參數
| first | - | 要生成的元素範圍起始 | ||||||
| count | - | 要生成的元素數 | ||||||
| policy | - | 所用的執行策略 | ||||||
| g | - | 將要調用的生成器函數。 簽名應等價於如下:
類型 | ||||||
| 類型要求 | ||||||||
-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 個元素 (函數模板) | |
| 賦連續函數調用結果到範圍中所有元素 (函數模板) | |
(C++20) |
保存 N 次函數應用的結果 (算法函數對象) |