コンテンツにスキップ

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章もありますが、こちらは興味のある方だけ見てくれればいいと思います。こちらから何か補足することはないと思ったので書きません。