std :: transform使用C++ 0x lambda表达式

Ste*_*end 30 c++ stl transform c++11

这是如何在C++ 0x中完成的?

std::vector<double> myv1;
std::transform(myv1.begin(), myv1.end(), myv1.begin(),
               std::bind1st(std::multiplies<double>(),3));
Run Code Online (Sandbox Code Playgroud)

原始问题和解决方案就在这里.

Edw*_*nge 35

std::transform(myv1.begin(), myv1.end(), myv1.begin(), 
   [](double d) -> double { return d * 3; });
Run Code Online (Sandbox Code Playgroud)

  • ` - > double`是不必要的; 它会自动推断出来. (23认同)
  • @potato - 它应该是,但是当前的编译器有时会忽略这个事实.最好只是把它放在一起. (4认同)
  • 另一种方法是:`std :: transform(myv1.begin(),myv1.end(),myv1.begin(),myv1.end(),std :: bind(std :: multiplies <double>( ),_ 1,3));` (2认同)

Ste*_*sop 30

在C++中使用这种功能样式的主要动机是"aaagh!iterator loops!",而C++ 0x使用基于范围的for语句消除了这种动机.我知道问题的一部分是找出lambda语法,但我认为问题的答案是"如何在C++ 0x中完成?" 是:

for(double &a : myv1) { a *= 3; }
Run Code Online (Sandbox Code Playgroud)

那里没有实际的功能对象,但如果它有助于你可以假装这{ a *= 3; }是一个高度缩写的lambda.对于可用性而言,无论哪种方式都是相同的,尽管草案标准定义了基于范围的等效for循环.


GMa*_*ckG 28

正如达里奥所说:

for_each(begin(myv1), end(myv1), [](double& a) { a *= 3; });
Run Code Online (Sandbox Code Playgroud)

for_each 允许修改元素,说它不是一个神话.


Dar*_*rio 8

使用可变方法,我们可以使用for_each直接通过引用更新序列元素.

for_each(begin(myv1), end(myv1), [](double& a) { a *= 3; });
Run Code Online (Sandbox Code Playgroud)


如果for_each实际上允许修改元素,则会有一些争论,因为它被称为"非变异"算法.

这意味着for_each不允许改变它操作的序列(这是指序列结构的变化- 即使迭代器无效).这并不意味着我们不能像往常一样修改向量的非const 元素 - 结构本身不受这些操作的影响.


Joh*_*ing 5

像这样:

vector<double> myv1;
transform(myv1.begin(), myv1.end(), myv1.begin(), [](double v)
{
    return v*3.0;
});
Run Code Online (Sandbox Code Playgroud)

  • 我想,对他自己而言.我赶紧指出我的*是正确的格式.:) (2认同)