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