c ++ 11 lambda:transform和for_each之间的区别

时间:2015-11-17 09:50:51

标签: c++11 lambda

我试图将字符串中的每个字符转换为小写字母。变换和foreach都可以在一行中完成:

// use transform
std::transform(str.begin(), str.end(), str.begin(), ::tolower);
// use for_each
for_each(str.begin(), str.end(), [](char &c){c = std::tolower(c);});

那么,区别是什么?哪一个在时间和空间效率方面更好?

2 个答案:

答案 0 :(得分:1)

你的意思是,transform vs for_each?因为你也可以使用lambdas作为transform的函数。

在这种情况下,transformfor_each之间没有真正的区别。 for_each是更通用的算法,我在这种情况下使用变换,因为否则你只是使用for_each重新实现变换,这不太清楚恕我直言,虽然清晰度有点主观,所以你的里程可能会有所不同。 / p>

就效率而言,在这种情况下没有区别。在将来,如果你对这种事情感兴趣,那么测量它可能更容易。

答案 1 :(得分:1)

for_each transform 这两种算法在功能上非常相似,因为它们都对序列的每个元素都执行操作。

但是,它们之间存在一些概念上的差异:

  1. for_each 放弃操作的返回值,而 transform 将返回值复制到输出范围中的元素。

  2. for_each 是一种非修改算法; 变换是一种变异算法。这意味着 for_each 不会隐式修改序列。非修改算法(如count,find)不会分配给任何序列元素。但是, for_each 的实际目的在于为输入序列中的每个元素调用提供给 for_each 的函数对象时产生的效果。 transform 是一种修改/变异算法,它通过修改给定序列的元素来产生效果。

  3. 可以从第二个差异中理解这个差异: for_each 允许由函数对象产生(如果有)副作用,而 transform 不能具有函数产生副作用的对象。这是因为 transform 本身能够产生副作用。实际上,在使用 for_each 的情况下,调用没有副作用的函数对象是没有意义的。

Refer to the following, for greater insights on for_each vs transform