繁体   English   中英

std::transform 可以替换为 std::accumulate 吗?

[英]Can std::transform be replaced by std::accumulate?

我有一个普遍的问题。 我们可以总是用std::accumulate替换std::transform吗? 我在许多情况/示例中都看到了这种替换。 那么这在理论上是否可行,如果是这样,那么为什么要引入std::transform呢?

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

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

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

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

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

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

没有。每个cppreference std::accumulate的二进制谓词op

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

所以它实际上不能转换你给它的范围,这是std::transform的主要用例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM