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;
    });

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

最佳答案

第一个版本:

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相同。

希望这可以帮助!

10-08 19:18