std::generate_n
来自 cppreference.com
在头文件 <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 > |
(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 开始) |
内容 |
[编辑] 参数
first | - | 要生成元素的范围的起始位置 | ||||||
count | - | 要生成的元素数量 | ||||||
policy | - | 要使用的执行策略。有关详细信息,请参阅 执行策略。 | ||||||
g | - | 将被调用的生成函数对象。 函数的签名应等效于以下内容
类型 Ret 必须是这样的,即类型为 OutputIt 的对象可以被解引用并分配类型为 Ret 的值。 | ||||||
类型要求 | ||||||||
-OutputIt 必须满足 LegacyOutputIterator 的要求。 | ||||||||
-ForwardIt 必须满足 LegacyForwardIterator 的要求。 |
[编辑] 返回值
如果 count > 0,则为分配的最后一个元素之后的迭代器,否则为 first。
[编辑] 复杂度
正好 std::max(0, count) 次调用 g() 和赋值。
[编辑] 异常
具有名为 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++ 标准。
DR | 应用于 | 已发布的行为 | 正确行为 |
---|---|---|---|
LWG 426 | C++98 | 复杂度要求是“正好count次调用 或赋值”,如果count为负数,则会出错 |
没有调用或赋值 如果count为非正数 |
LWG 865 | C++98 | 生成范围后第一个元素的位置 没有返回 |
已返回 |
[编辑] 另请参阅
将给定值复制赋值给范围内的 N 个元素 (函数模板) | |
将连续函数调用的结果赋值给范围内的每个元素 (函数模板) | |
(C++20) |
保存函数的 N 次应用的结果 (niebloid) |