ラムダ式のサンプル lambda

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;
};

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);