我试图将字符串中的每个字符转换为小写字母。变换和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);});
那么,区别是什么?哪一个在时间和空间效率方面更好?
答案 0 :(得分:1)
你的意思是,transform
vs for_each
?因为你也可以使用lambdas作为transform
的函数。
在这种情况下,transform
和for_each
之间没有真正的区别。 for_each
是更通用的算法,我在这种情况下使用变换,因为否则你只是使用for_each重新实现变换,这不太清楚恕我直言,虽然清晰度有点主观,所以你的里程可能会有所不同。 / p>
就效率而言,在这种情况下没有区别。在将来,如果你对这种事情感兴趣,那么测量它可能更容易。
答案 1 :(得分:1)
for_each 和 transform 这两种算法在功能上非常相似,因为它们都对序列的每个元素都执行操作。
但是,它们之间存在一些概念上的差异:
for_each 放弃操作的返回值,而 transform 将返回值复制到输出范围中的元素。
for_each 是一种非修改算法; 变换是一种变异算法。这意味着 for_each 不会隐式修改序列。非修改算法(如count,find)不会分配给任何序列元素。但是, for_each 的实际目的在于为输入序列中的每个元素调用提供给 for_each 的函数对象时产生的效果。 transform 是一种修改/变异算法,它通过修改给定序列的元素来产生效果。
可以从第二个差异中理解这个差异: for_each 允许由函数对象产生(如果有)副作用,而 transform 不能具有函数产生副作用的对象。这是因为 transform 本身能够产生副作用。实际上,在使用 for_each 的情况下,调用没有副作用的函数对象是没有意义的。
Refer to the following, for greater insights on for_each vs transform