for_each和transform

时间:2013-01-11 01:59:53

标签: c++ algorithm c++11 lambda

for_each(ivec.begin(),ivec.end(),
        []( int& a)->void{ a = a < 0 ? -a : a; 
    });

transform(ivec.begin(),ivec.end(),ivec.begin(),
        [](int a){return a < 0 ? -a : a;
    });

我目前正在学习lambdas,我很好奇上面发布的两个实现有何不同?

3 个答案:

答案 0 :(得分:5)

您显示的两个实现在逻辑上没有区别(假设您通过添加返回获得第一个版本)。第一个元素修改元素,而最后一个元素用新值覆盖元素。

我看到的最大区别是transform你只能传递abs而不是重新实现它的lambda。

答案 1 :(得分:4)

transform在功能语言中被称为map。也就是说,它将函数应用于输入范围中的每个元素,并将输出存储到输出范围中。 (因此通常不打算修改输入,而是存储一系列输出)

for_each只是丢弃应用函数的返回值(因此可能会修改输入)。

这是主要的区别。它们相似,但设计用于不同的目的。

答案 2 :(得分:2)

第一个版本:

for_each(ivec.begin(),ivec.end(),
      []( int& a)->void{ a = a < 0 ? -a : a; 
});

通过调用lambda函数

来工作
 []( int& a)->void{ a = a < 0 ? -a : a; }

对于范围中的每个元素,将范围中的元素作为参数传递。因此,它通过直接更改其值来就地更新元素。

第二个版本:

transform(ivec.begin(),ivec.end(),ivec.begin(),
    [](int a){return a < 0 ? -a : a;
});

通过应用lambda函数

来工作
[](int a){return a < 0 ? -a : a;}

ivec.begin()ivec.end()范围内的每个元素,生成一系列值,然后将这些值写回从ivec.begin()开始的范围。这意味着它会使用通过将函数应用于每个数组元素而生成的值范围覆盖范围的原始内容,因此元素将被覆盖而不是就地修改。但是,净效果与原始for_each相同。

希望这有帮助!