C ++ 11Lambda式は、変数(変数のキャプチャ)とローカル変数(ローカル変数)をキャプチャします

Lambdaで角括弧[]ローカル変数名前を付けることは、変数のキャプチャ呼ばれます変数が**角括弧[] **で指定されていない場合、ラムダ式では使用できません。ラムダキャプチャ変数は、デフォルトで値によって渡されます。
次のコードなど:

#include <iostream>
#include <algorithm>
#include <iterator>
#include <vector>

using namespace std;

int main(int argc, char** argv)
{
    // 初始化向量
    vector<int> data{1,2,3,4,5,6,7,8,9};
    int times = 3;

    // 输出原始数据
    // 输出
    cout << "before transform:\n";
    copy(data.begin(),data.end(),ostream_iterator<int>(cout,","));
    cout << endl;

    // 定义表达
    auto op_times = [times](int i){return i * times;};
    transform(data.begin(),data.end(),data.begin(),op_times);

    // 输出
    cout << "after transform times=" << times << endl;
    copy(data.begin(),data.end(),ostream_iterator<int>(cout,","));
    cout << endl;

    // 改变本地变量
    times = 5;
    transform(data.begin(),data.end(),data.begin(),op_times);
    
    // 输出
    cout << "after transform times=" << times << endl;
    copy(data.begin(),data.end(),ostream_iterator<int>(cout,","));
    cout << endl;
    
    return 0;
}

プログラム出力:
ここに画像の説明を挿入
ローカル変数timesの値が3から5に変更された場合変換関数を呼び出した結果は各要素に5を掛けていません。これは変換関数を2回呼び出すのと同じです。ローカル変数の時間の変化に伴って呼び出しの結果が変化することを認識するために変数は参照によってキャプチャされる必要があります。

auto op_times = [&times](int i){return i * times;};

ここに画像の説明を挿入
プログラムの成果は期待に応えました!

ラムダ式が変数をキャプチャした後、キャプチャされた変数をラムダ式で変更できますか?次のコードを見てください。

#include <iostream>
#include <iostream>
#include <algorithm>
#include <iterator>
#include <vector>

using namespace std;

int main(int argc, char** argv)
{
    int x{0};
    auto test_func = [x](int y){
        // 改变参数的值
        x = 1;
        y = 2;
        return x + y;
    };
    int local{0};
    cout <<"after call test_func:"<< test_func(local) <<",x = " << x <<",local=" << local << endl;
    return 0;
}

コンパイルの結果は次のとおりです。
ここに画像の説明を挿入
これは、値転送モードでの変数のキャプチャをLambda式で変更できないことを示しています。

おすすめ

転載: blog.csdn.net/wujuxKkoolerter/article/details/114101943