使用C++ 11 Lambda函数更改vector(list,deque ...)中的所有元素

G-7*_*-71 3 c++ lambda c++11

我有以下代码:

#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)


rei*_*ima 8

你应该使用transform:

std::transform( obj.begin(), obj.end(), obj.begin(), []( int x )
{ 
    return x + 2; 
} );
Run Code Online (Sandbox Code Playgroud)


Ker*_* SB 6

通过引用传递参数并修改引用:

std::for_each( obj.begin(), obj.end(), [](int & x){ x += 2; } );
//                                        ^^^^^
Run Code Online (Sandbox Code Playgroud)