C++ 标准库中有
std::transform
和 std::reduce
函数。如果我们使用 std::transform_reduce
而不是 std::transform
和 std::reduce
的组合,我们有什么优势(除了缩短代码)?
基于迭代器的
<algorithm>
如果没有临时副本就无法组合。
如果函数将惰性迭代器返回到转换后的范围,那么它们就可以,但无论好坏,这都不是这些函数的设计方式。
因此,您会得到
XXX_YYY
,无需额外副本即可完成这两件事,但并非所有组合都可用,并且它们仍然无法扩展到多个操作。
允许将操作组合到各种计算管道中是
<ranges>
的主要优点之一。
std::transform_reduce
在<numeric>
中,目标更像是“提供std::inner_product
的通用且非序列版本”。具体来说,都是Init op f(x_0, y_0) op f(x_1, y_1) ... op f(x_n, y_n)
,但是std::inner_product
需要从头到尾一一准确计算,而std::transform_reduce
则不强制这样做,并且有并行版本。此外,std::transform_reduce
还可以通过一元运算进行变换,即Init op f(x_0) op f(x_1) ... op f(x_n)
这类似于
std::inclusive_scan
和std::partial_sum
之间的关系。