3.06.その他の機能¶
コメント¶
使う頻度が高い順にまとめておきます
グローバル変数¶
再帰関数を書くときに使うと引数を減らしたりすることができます。
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
マクロを使っています。他にも色々なマクロがあるので使いたければ調べてみてください。ただし、マクロは思わぬバグを引き起こすことがあるので使う時は自己責任です。
三項演算子(条件演算子)¶
例えばa
とb
の和は \(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章もありますが、こちらは興味のある方だけ見てくれればいいと思います。こちらから何か補足することはないと思ったので書きません。