如何在C ++ 0x中完成?
std::vector<double> myv1;
std::transform(myv1.begin(), myv1.end(), myv1.begin(),
std::bind1st(std::multiplies<double>(),3));
原始问题和解决方案是here。
答案 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));