在C ++ 11中,为什么std::for_each(lst.begin(), lst.end(), some_lambda);
与std::transform(lst.begin(), lst.end(), lst.begin(), some_lambda);
不一样?
第二个起作用,第一个似乎什么都不做。我忽略了什么吗?
示例lambda:
auto some_lambda = [=] (std::string s) -> std::string {
return "0" + s;
};
示例列表:
std::list<std::string> lst; lst.push_back("");
答案 0 :(得分:4)
简化一点,std::for_each
最终结果如下:
for (iter = start; iter != end; ++iter)
f(*iter);
std::ransform
更像是这样:
for (iter = start; iter != end; ++iter, ++result)
*result = f(*iter);
transform
有另一种变体,但总体思路仍然存在。
请注意std::for_each
在对范围内的所有项目调用后返回函数对象。基于此,你可以使用它作为std::accumulate
的平庸模仿,通过累积你在函数对象中关心的任何东西,并在它返回后从中检索累积值。
答案 1 :(得分:3)
第一个忽略函数的返回值。如果要修改,则使用引用作为函数参数。