GUZAI3ノートブック

友人であるGUZAI3様の依頼で備忘録を書いています。

C++のLambda式で多重for文を抜ける

多重for文 を抜ける方法はいくつかあって、例えば各ループごとにbreak判定したり、goto文で飛ぶ。最近は Lambda式 でうまく抜ける方法を知ったので、AtCoderの過去問を解く際に使ってみた。

過去問

atcoder.jp

提出コード

#include <iostream>
#include <vector>

int main() {
  int n, m;
  std::vector<std::string> a, b;
  std::cin >> n >> m;
  a.resize(n);
  b.resize(m);
  for (int i = 0; i < n; i++) {
    std::cin >> a[i];
  }
  for (int i = 0; i < m; i++) {
    std::cin >> b[i];
  }

  for (int i = 0; i < n - m + 1; i++) {
    for (int j = 0; j < n - m + 1; j++) {
      bool match = true;


      // Lambda式ここから。
      // 平面の座標を総当りして、ひとつでも不適な点があれば抜ける。
      [&] {
        for (int k = 0; k < m; k++) {
          for (int l = 0; l < m; l++) {
            if (a[i + k][j + l] != b[k][l]) {
              // 不適な点があったので探索を中断して抜ける。
              match = false;
              return;
            }
          }
        }
      }();
      // Lambda式ここまで。
      // 途中で抜けた場合はここまで飛ぶ。


      if (match) {
        puts("Yes");
        return 0;
      }
    }
  }
  puts("No");
  return 0;
}

ループ脱出のためだけに使われる少しの間しか役割を持たない変数が消える。
思考の邪魔にならなくて良い。