型
auto f = [&](){
a++;
};
利点
- main関数内で関数が定義でき、main関数内の変数にもアクセスできる
- よって「関数に分離したいが変数をグローバルに書き直すのが面倒」を省略できる
実例
// 二分探索の判定関数 auto can = [&](ll center){ ll sum=0; rep(i,center+1) sum+=A[i]; FOR(i, center+1, N){ // 自分より上のモンスターを食っていけるか if(sum*2 >= A[i]){ sum += A[i]; }else{ return false; } } return true; };
ラムダ式による再帰関数
- autoで書けない
- function
と書く必要がある
// 実例 function<ll(ll)> dfs = [&](ll i){ if(d[i]!=-1) return d[i]; if(G[i].size()==0) return d[i]=1; mint sum = 1; for(ll to : G[i]){ sum += dfs(to); } return d[i] = sum.x; };
- https://atcoder.jp/contests/apg4b/tasks/APG4b_ad?lang=ja
- 「functionは定数倍遅い」とどこかで書かれていたが提出してみるとそうでもなかった
- verified
- globalに変数もdfsも移し替えるのはタイムロスなので、ラムダ式でやるのが望ましい
- 他の書き方もある
- satanicさん (リンク先のスレッド参照)
そういやラムダ式で再帰書くの([&](auto&& f, ...) -> T{};)慣れてきた
— satanic@研究🔥 (@satanic0258) March 3, 2019
snukeさんのラムダ式dfs
auto dfs = [&](auto dfs, int v) -> void { for (int u : to[v]) { d[u] = max(d[u], d[v]-1); dfs(dfs,u); } }; dfs(dfs,0);