std::transform 可以替换为 std::累积吗?

Can std::transform be replaced by std::accumulate?

本文关键字:std 替换 transform      更新时间:2023-10-16

我有一个一般性的问题。我们总是可以用std::accumulate代替std::transform吗?我已经在很多情况下/示例中看到了这种替换。那么这在理论上是否可能,如果是,那么为什么引入std::transform

这两种算法具有完全不同的目的。

std::accumulate在函数式编程世界中被称为折叠,其目的是迭代序列的元素并将双参数折叠操作应用于这些元素,其中一个参数是前一个折叠的结果,另一个参数是序列的元素。它自然返回单个结果 - 将序列的所有元素折叠成一个值。

另一方面,std::transform将值从一个序列复制到另一个序列,对每个元素应用一元运算。它将迭代器返回到序列的末尾。

事实上,你可以提供任何代码作为折叠操作,允许我们使用std::accumulate作为通用循环替换,包括将值复制到其他容器的选项,但这是不明智的,因为引入这些(相当简单(算法的全部原因是使程序更明确。让一个算法来执行通常与另一个算法相关的任务是不那么明确和违反直觉的。

一个通用的循环替换算法是 std::for_each,但随着循环的范围,它在很大程度上已经过时了,我已经很长时间没有看到它被使用过了。

我们总是可以用std::accumulate替换std::transform吗?

不。 根据 cpp 首选项std::accumulate的二进制谓词op具有

op不得使任何迭代器(包括结束迭代器(无效,也不得修改所涉及的范围的任何元素,也不得*last

因此,它实际上无法改变您为其提供的范围,这是std::transform的主要用例。