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)
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
允许修改元素,说它不是一个神话.
使用可变方法,我们可以使用for_each
直接通过引用更新序列元素.
for_each(begin(myv1), end(myv1), [](double& a) { a *= 3; });
Run Code Online (Sandbox Code Playgroud)
for_each
实际上允许修改元素,则会有一些争论,因为它被称为"非变异"算法.
这意味着for_each
不允许改变它操作的序列(这是指序列结构的变化- 即使迭代器无效).这并不意味着我们不能像往常一样修改向量的非const 元素 - 结构本身不受这些操作的影响.
像这样:
vector<double> myv1;
transform(myv1.begin(), myv1.end(), myv1.begin(), [](double v)
{
return v*3.0;
});
Run Code Online (Sandbox Code Playgroud)