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

时间:2011-11-10 18:21:56

标签: 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;
}

结果是: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?

5 个答案:

答案 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;
} );