std :: transform与std :: for_each不相似?

时间:2013-04-26 19:04:41

标签: c++ c++11 functional-programming

在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("");

2 个答案:

答案 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)

第一个忽略函数的返回值。如果要修改,则使用引用作为函数参数。