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

Changing all elements in vector(list, deque...) using C++11 Lambda functions

本文关键字:deque 元素 list Lambda c++ 函数 vector 使用      更新时间:2023-10-16

我有以下代码:

#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

我想改变vector (obj)中的所有元素,使用新的c++ 11标准的Lambda函数。

for_each函数的实现代码:

template<class InputIterator, class Function>
Function for_each(InputIterator first, InputIterator last, Function f)
{
    for ( ; first!=last; ++first )
        f(*first);
    return f;
}

*首先通过值传递,元素的范围被改变,我必须使用的for_each的替代方案是:12,22,32

我想改变vector (obj)中的所有元素,使用新的c++ 11标准的Lambda函数。

你必须这样做:

std::for_each( obj.begin(), obj.end(), [](int & x)
{                                          //^^^ take argument by reference
   x += 2; 
});

您的(不是我的)代码中,lambda的返回类型推断为int,但返回值被忽略,因为没有人使用它。这就是为什么在我的代码中没有返回语句,并且此代码的返回类型推断为void

顺便说一下,对于这个目的,我发现基于范围的for循环比std::for_each更简单:
for( int &v : obj )  v += 2;

你应该使用transform:

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

通过引用传递实参,并修改引用:

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

除了已经存在的(并且完全正确的)答案之外,您还可以使用现有的lambda函数,它返回结果而不是修改参数,并且只使用std::transform而不是std::for_each:

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