std::transform_inclusive_scan
定义于头文件 <numeric> | ||
template<class InputIt, class OutputIt, class BinaryOperation, class UnaryOperation > | (1) | (C++17 起) |
template<class ExecutionPolicy, class ForwardIt1, class ForwardIt2, class BinaryOperation, class UnaryOperation > | (2) | (C++17 起) |
template<class InputIt, class OutputIt, class BinaryOperation, class UnaryOperation, class T > | (3) | (C++17 起) |
template<class ExecutionPolicy, class ForwardIt1, class ForwardIt2, class BinaryOperation, class UnaryOperation, class T > | (4) | (C++17 起) |
以 unary_op
变换范围 [first, last)
中的每个元素,然后用 binary_op
在范围上计算包含前缀和,可选地以 init
为初值,并写结果到始于 d_first
的范围。“包含”表明第 i 个元素包含于第 i 个和。
形式上,通过每个 [d_first, d_first + (last - first)) 中的迭代器 i
赋以下值
- 对于重载 (1-2) ,对于 [first, first + (i - d_first + 1)) 中每个
j
,为unary_op(*j)...
在binary_op
上的的广义非交换和, - 对于重载 (3-4) ,对于 [first, first + (i - d_first + 1)) 中每个
j
,为init, unary_op(*j)...
在binary_op
上的广义非交换和,
其中广义非交换和 GNSUM(op, a
1, ..., a
N) 定义如下:
- 若 N=1 ,则为 a
1 - 若 N > 1 ,则为 op(GNSUM(op, a
1, ..., a
K), GNSUM(op, a
M, ..., a
N)) ,对于任何 1 < K+1 = M ≤ N 的 K
换言之,能以任意顺序进行和运算,而若 binary_op
非结合则行为为非确定的。
重载 (2, 4) 按照 policy
执行,且仅若 std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> 为 true 才参与重载决议。
unary_op
与 binary_op
不应非法化范围 [first, last) 或 [d_first, d_first + (last - first)) 中的迭代器(含尾迭代器)或子范围,不修改其中的元素。否则行为未定义。
目录 |
[编辑]参数
first, last | - | 求和的元素范围 |
d_first | - | 目标范围起始;可以等于 first |
policy | - | 所用的执行策略。细节见执行策略。 |
init | - | 初值 |
unary_op | - | 一元函数对象 (FunctionObject ) ,将要被应用到输入范围中的每个元素。返回类型必须可接受为 binary_op 的输入。 |
binary_op | - | 二元函数对象 (FunctionObject ) ,将应用于 unary_op 的结果、其他 binary_op 的结果,还有 init ,若提供它。 |
类型要求 | ||
-InputIt 必须满足 InputIterator 的要求。 | ||
-OutputIt 必须满足 OutputIterator 的要求。 | ||
-ForwardIt1 必须满足 ForwardIterator 的要求。且若不提供 init ,则 ForwardIt1 的 value_type 必须为可移动构造 (MoveConstructible ) 且 binary_op(unary_op(*first), unary_op(*first)) 必须可转换为 ForwardIt1 的 value_type | ||
-ForwardIt2 必须满足 ForwardIterator 的要求。 | ||
-T (若提供 init ) 必须满足 MoveConstructible 的要求。binary_op(init, unary_op(*first)) 、 binary_op(init, init) 和 binary_op(unary_op(*first), unary_op(*first)) 都必须可转换为 T |
[编辑]返回值
指向最后被写入元素后一位置的迭代器。
[编辑]复杂度
每个 binary_op
和 unary_op
应用 O(last - first) 次。
[编辑]异常
拥有名为 ExecutionPolicy
的模板参数的重载按下列方式报告错误:
- 若作为算法一部分调用的函数的执行抛出异常,且
ExecutionPolicy
是三个标准策略之一,则调用 std::terminate 。对于任何其他ExecutionPolicy
,行为是实现定义的。 - 若算法无法分配内存,则抛出 std::bad_alloc 。
[编辑]注意
unary_op
不应用到 init
。
参数 init
出现于最后,不同于 std::transform_exclusive_scan ,因为它对此函数是可选的。
[编辑]示例
本节未完成 原因:暂无示例 |
[编辑]参阅
计算区间内元素的部分和 (函数模板) | |
将一个函数应用于某一范围的元素 (函数模板) | |
(C++17) | 类似 std::partial_sum ,第 i 个和中包含第 i 个输入 (函数模板) |
(C++17) | 应用函数对象,然后进行排除扫描 (函数模板) |