コンテンツにスキップ

3.06.その他の機能

APG4bの該当ページ

コメント

使う頻度が高い順にまとめておきます

グローバル変数

再帰関数を書くときに使うと引数を減らしたりすることができます。 main 関数の外に書くというだけですが、かなりよく使うと思います。

文字コード

これは一度 1.12.文字列と文字 で少し説明しました。

アルファベットなどを添え字にして配列で管理したり、何文字目のアルファベットか?ということを調べるときによく使います。 また、64bit整数でも表せないくらいの非常に大きな数を受け取って各桁を見ていくときに以下のようにすると 文字 から 数字 に変換できます。

char c = '3';
cout << c - '0' + 1 << endl; // 4

do-while (+ 順列全列挙)

do-while は順列を全列挙するときによく使います。 以下に例を書いておきます。

vector<int> vec = {1, 2, 3};
do{
    for(int i = 0; i < 3; i++){
        cout << vec[i];
        if(i == 2) cout << endl;
        else cout << " ";
    }
}while(next_permutation(vec.begin(), vec.end()));

// 出力結果:
// 1 2 3
// 1 3 2
// 2 1 3
// 2 3 1
// 3 1 2
// 3 2 1

Warning

next_permutation を使う時はあらかじめ順列を列挙する配列がソートされてないと期待通りの挙動をしません。気を付けてください。

ラムダ式

僕はコンテスト中にコードを書いているときに「こんな関数があったら簡潔にコードを書けそうだ!でもわざわざ main の前に戻るのも面倒くさい~」という時や、配列を sort するのに関数を使いたいときにラムダ式を使っています。

マクロ

僕は rep マクロと all マクロを使っています。他にも色々なマクロがあるので使いたければ調べてみてください。ただし、マクロは思わぬバグを引き起こすことがあるので使う時は自己責任です。

三項演算子(条件演算子)

例えば ab の和は \(0\) か?という問題のコードを三項演算子と if 文の2パターンで書いてみます。
※コードはmain関数の中だけ書きます。

if

int a, b;
cin >> a >> b;
if(a + b == 0){
    cout << "Yes" << endl;
}
else{
    cout << "No" << endl;
}

三項演算子

int a, b;
cin >> a >> b;
cout << (a + b == 0 ? "Yes" : "No") << endl;

このように簡単な条件処理の時は三項演算子の方が簡潔に書くことが出来ます。

const

競技プログラミングの問題を解いていると次のような問題を見ることがあります。

(何か)の場合の数を \(10^9+7\) で割った余りを求めよ

このような場合に

const int mod = 1000000007;

などとしておくと楽になります。
constをつけると変更ができなくなる代わりに実行速度が速くなります。

goto

あまり使いませんが、多重ループから抜けたいときなどに使います。 コードの例を載せておきます。

cout << "Hello, ";

goto SKIP;
cout << "world!" << endl; //この行は飛ばされる

SKIP:
cout << "AtCoder!" << endl;

演習問題

next_permutation だけは使えないと何をすればいいのか分からなくなってしまう問題があるので練習しておきましょう

おわりに

これで第3章も終わりとなります。お疲れさまでした!!!!!
ここまで頑張ってきた方はもう十分コンテストで戦う力がついていると思います。是非コンテストにたくさん出ましょう。
APG4bには第4章もありますが、こちらは興味のある方だけ見てくれればいいと思います。こちらから何か補足することはないと思ったので書きません。