我有以下代码:
#include <iostream>
#include <vector>
#include <algorithm>
int main( int argc, char* argv[] )
{
std::vector< int > obj;
obj.push_back( 10 );
obj.push_back( 20 );
obj.push_back( 30 );
std::for_each( obj.begin(), obj.end(), []( int x )
{
return x + 2;
} );
for( int &v : obj )
std::cout << v << " ";
std::cout << std::endl;
return 0;
}
结果是:10,20,30
我想使用新C ++ 11标准的Lambda函数更改vector(obj)中的所有元素。
这是实施代码for_each
功能:
template<class InputIterator, class Function>
Function for_each(InputIterator first, InputIterator last, Function f)
{
for ( ; first!=last; ++first )
f(*first);
return f;
}
*首先通过值和元素的cope传递,for_each
的替代是什么我必须使用我有结果:12,22,32?
答案 0 :(得分:13)
我想使用新的C ++ 11标准的Lambda函数更改vector(obj)中的所有元素。
你必须这样做:
std::for_each( obj.begin(), obj.end(), [](int & x)
{ //^^^ take argument by reference
x += 2;
});
在你的(不是我的)代码中,lambda的返回类型推导为int
,但返回值被忽略,因为没有人使用它。这就是我的代码中没有return语句的原因,并且此代码的返回类型推导为void
。
顺便说一句,为此,我发现基于范围的for
循环比std::for_each
更简洁:
for( int &v : obj ) v += 2;
答案 1 :(得分:8)
您应该使用transform
:
std::transform( obj.begin(), obj.end(), obj.begin(), []( int x )
{
return x + 2;
} );
答案 2 :(得分:6)
通过引用传递参数并修改引用:
std::for_each( obj.begin(), obj.end(), [](int & x){ x += 2; } );
// ^^^^^
答案 3 :(得分:3)
std::for_each( obj.begin(), obj.end(), []( int& x )
{
x += 2;
} );
答案 4 :(得分:3)
除了已经存在的(并且完全正确)答案之外,您还可以使用现有的lambda函数,该函数返回结果而不是修改参数,只需使用std::transform
代替std::for_each
:
std::transform(obj.begin(), obj.end(), obj.begin(), []( int x )
{
return x + 2;
} );