std::transform 可以替换为 std::累积吗?
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
吗?
不。 根据 cpp 首选项std::accumulate
的二进制谓词op
具有
op
不得使任何迭代器(包括结束迭代器(无效,也不得修改所涉及的范围的任何元素,也不得*last
。
因此,它实际上无法改变您为其提供的范围,这是std::transform
的主要用例。
相关文章:
- 初始化 std::vector 替换为单大括号而不是双大括号
- 替换 std::greater 和其他
- std::map:当元素不可默认构造时创建/替换元素
- 为什么这个分配器不适用于"std::allocate_shared"?奇怪的模板替换错误
- 仅当一个参数中未使用 std::function 时,模板函数替换才有效
- 我有模板功能.通过使用函数std::for_each,用这个容器中的最大数字替换每个正数
- 用C++替换std::字符串中的一个子字符串,但不能全部替换
- 替换现有条目并在 std::map 中添加新条目
- 使用"std::function"和先前推断的模板参数替换失败 - 为什么?
- std::transform 可以替换为 std::累积吗?
- std::元组作为成员替换,方便宏
- 使用 std::文件系统替换文件
- 从自身内部替换 std::函数(通过将移动赋值到 *this?)
- 使用 constexpr 和 std::array 进行静态初始化来替换动态初始化的 std::vector 的闰年
- 替换 istrstream(char* s, std::streamsize n) 构造函数?
- 如何通过std ::变体正确替换boost ::变体
- C :在我们拥有迭代器的std :: unordered_set中替换一个元素
- std::字符串替换不保留结尾?
- 使用 std::enable_if 重载函数以避免模板替换错误
- 替换(或重新实现?)std::函数用于某些统计和测试