ラムダ式の「キャプチャの&」と「パラメータの&」は全然違う
(2024/1/9 スーパー意味不明な記載になっていたので書き直し)
ラムダ式が全然わからなくて、dfs書いてて一生エラー吐きまくってたんだけど、やっと解決したから記録しておく。
[&]と(int &x)はしっかり区別しなきゃだめ。
まずは例示から。
#include <bits/stdc++.h> using namespace std; int main() { int a=1; int b=2; int c=3; auto f=[](int x, int y, int z){ x*=3; y*=3; z*=3; }; f(a,b,c); cout<<a<<b<<c<<endl; }
この場合出力されるのは123なのか369なのかってことだけど、
123
です。
キャプチャの&:[&]は、外にある変数を参照で使えるという意味。
パラメータの&:(int &x)は引数として入力された変数を参照で使うという意味。
上のコードはパラメータに&がついてないからfはa,b,cをコピーで渡しているので、値は更新されない。
参照で渡すときはパラメータに&をつけて
#include <bits/stdc++.h> using namespace std; int main() { int a=1; int b=2; int c=3; auto f=[](int &x, int &y, int &z){ x*=3; y*=3; z*=3; }; f(a,b,c); cout<<a<<b<<c<<endl; }
にする。
これで答えは
369
になる。
キャプチャの&をつかうならば、
#include <bits/stdc++.h> using namespace std; int main() { int a=1; int b=2; int c=3; auto f=[&](){ a*=3; b*=3; c*=3; }; f(); cout<<a<<b<<c<<endl; }
これで答えは
369
になる。
きっちり区別しながらコードを書くようにする。