std::generate_n
来自 zh.cppreference.net
| 定义于头文件 <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 生成的值赋给范围 count 中起始于 first 的前 count > 0 个元素,如果 。否则不执行任何操作。2) 同 (1)
policy,但按照 执行。
true 此重载仅当以下表达式的值为 |
|
时参与重载决议: |
|
|
(C++20 前) |
参阅
| 参数 | first | - | ||||||
| 要生成的元素范围的起始 | count | - | ||||||
| 要生成的元素个数 | policy | - 要使用的执行策略 | ||||||
| g | -
将会被调用的生成器函数对象。
函数的签名应等价于以下形式:
| |||||||
| 的值。 | ||||||||
类型要求
OutputIt- 必须满足 老式输出迭代器 (LegacyOutputIterator) | ||||||||
的要求。
ForwardIt- 必须满足 老式向前迭代器 (LegacyForwardIterator) | ||||||||
的要求。
返回值count > 0如果 first,则返回最后一个被赋值元素之后的迭代器,否则返回
。
复杂度std::max(0, count)恰好 g() 次调用
和赋值。
异常ExecutionPolicy带有名为
- 的模板参数的重载按如下方式报告错误:
ExecutionPolicy如果作为算法一部分调用的函数抛出异常,且 是标准策略之一,则调用 std::terminateExecutionPolicy。对于任何其他 - ,行为由实现定义。如果算法无法分配内存,则抛出 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++ 标准。 | DR | 应用于 | 发布时的行为 |
|---|---|---|---|
| 正确行为 | LWG 426 | C++98
count复杂度要求为“恰好 次调用 count或赋值”,当 |
为负数时存在问题
若 count 非正,则不进行调用或赋值
|
| LWG 865 | C++98 | 没有返回生成范围之后的第一个元素的位置
返回 |
返回 |
参阅
| 赋值给定的值给范围中的 N 个元素 (函数模板 & 算法函数对象) | |
(C++20) |
|
| 将连续函数调用的结果赋值给范围中的每个元素 (函数模板 & 算法函数对象) | |
(C++20) |
|
(C++20) |
保存 N 次函数应用的结果 (算法函数对象) |