为什么在C++标准库中有std::transform_reduce?

nvbavucw  于 2023-08-09  发布在  其他
关注(0)|答案(2)|浏览(227)

我们在C++标准库中有std::transformstd::reduce函数。如果我们使用std::transform_reduce而不是std::transformstd::reduce的组合,我们有什么优势(除了缩短代码)?

kgsdhlau

kgsdhlau1#

基于迭代器的<algorithm>在没有临时副本的情况下无法组合。
如果函数向转换后的范围返回惰性迭代器,它们可以,但无论如何,这不是这些函数的设计方式。
因此,您将得到XXX_YYY,它可以在没有额外副本的情况下完成这两件事,但并非所有组合都可用,并且它们仍然无法扩展到多个操作。
<ranges>的主要优点之一是允许将操作组合到排序的计算管道中。

8ljdwjyq

8ljdwjyq2#

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_scanstd::partial_sum之间的关系。

相关问题