我有以下代码:
#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;
}
Run Code Online (Sandbox Code Playgroud)
结果是: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;
}
Run Code Online (Sandbox Code Playgroud)
*首先通过值和元素的变化来改变,for_each我必须使用的替代方案是我有一个结果:12,22,32?
Naw*_*waz 13
我想使用新的C++ 11标准的Lambda函数更改vector(obj)中的所有元素.
你要这样做:
std::for_each( obj.begin(), obj.end(), [](int & x)
{ //^^^ take argument by reference
x += 2;
});
Run Code Online (Sandbox Code Playgroud)
在你的(不是我的)代码中,lambda的返回类型被推导为int,但返回值被忽略,因为没有人使用它.这就是我的代码中没有return语句的原因,并且推导出与void此代码一样的返回类型.
顺便说一句,我发现基于范围的for循环比std::for_each这个目的更简洁:
for( int &v : obj ) v += 2;
Run Code Online (Sandbox Code Playgroud)
你应该使用transform:
std::transform( obj.begin(), obj.end(), obj.begin(), []( int x )
{
return x + 2;
} );
Run Code Online (Sandbox Code Playgroud)
通过引用传递参数并修改引用:
std::for_each( obj.begin(), obj.end(), [](int & x){ x += 2; } );
// ^^^^^
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4025 次 |
| 最近记录: |