アジの開きを閉じる。

競プロ(AtCoder)中心のブログ

【随時更新】競プロでちょっと便利な実装Tips(C++)

便利だなーと思ったTips.(C++)

vectorの要素出力で,スペース区切りで最後に改行

for(int i = 0; i < vec.size(); i++) {
  cout << vec[i] << " /n"[i + 1 == vec.size()];
}

vector⇄set の生成

コンストラクタを使う.

// vector→set
set<int> st(vec.begin(), vec.end());

// set→vector
vector<int> vec(st.begin(), st.end());

set, mapの要素全取得

for-eachを使う.

// set
for(auto val : st) {
  // ...
}

// map
for(auto [key, val] : mp) {
  // ...
}

pair, tupleの分解

構造化束縛を使う.

//pair
auto [a, b] = p;

// tuple
auto [a, b, c] = t;

グリッドで隣接する八方を調べる

差分-1~1の二重for.dx=0, dy=0はcontinueすることに注意!

// x: 今見ているマスのx座標
// y: 今見ているマスのy座標
for(int dx = -1; dx <= 1; dx++) {
  for(int dy = -1; dy <= 1; dy++) {
    if(dx == 0 && dy == 0) continue;

    int nx = x + dx;
    int ny = y + dy;
    // ...
  }
}

枠内チェックも一緒にしちゃう版.

for(int nx = max(x - 1, 0); nx <= min(x + 1, h - 1); nx++) {
  for(int ny = max(y - 1, 0); ny <= min(y + 1, w - 1); ny++) {
    if(nx == x && ny == y) continue;

    // ...
  }
}