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

时间:2010-10-07 19:46:23

标签: c++ stl c++11 transform

如何在C ++ 0x中完成?

std::vector<double> myv1;
std::transform(myv1.begin(), myv1.end(), myv1.begin(),
               std::bind1st(std::multiplies<double>(),3));

原始问题和解决方案是here

6 个答案:

答案 0 :(得分:34)

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

答案 1 :(得分:28)

就像达里奥所说:

for_each(begin(myv1), end(myv1), [](double& a) { a *= 3; });
允许

for_each修改元素,说这不是一个神话。

答案 2 :(得分:28)

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

for(double &a : myv1) { a *= 3; }

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

答案 3 :(得分:8)

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

for_each(begin(myv1), end(myv1), [](double& a) { a *= 3; });

<小时/> 如果for_each实际上允许修改元素,因为它被称为“非变异”算法,一直存在争议。

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

答案 4 :(得分:5)

像这样:

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

答案 5 :(得分:1)

我正在使用支持C ++ 11绑定适配器的VS2012。要绑定二进制函数的第一个元素(作为bind1st用来做),你需要添加一个 _1(占位符参数)。需要包含绑定功能。

using namespace std::placeholders;
std::transform( myv1.begin(), myv1.end(), myv1.begin(),
                 std::bind( std::multiplies<double>(),3,_1));