この記事は Competitive Programming (1) Advent Calendar 2020 6 日目の記事です。
昨日の記事はわくさんの 競技プログラミングの作問環境構築(gitとrime編) でした。
C++ の標準ライブラリには便利な関数がたくさんあります。 特に <algorithm> と <numeric> には便利な関数が多いので、その紹介をしようという記事です。
C++ 使いは cpprefjp を読もう!
find
count
fill
unique
reverse
shuffle
sort
lower_bound
upper_bound
min
max
min_element
max_element
next_permutation
など
flag を持って、 for 文回して、そのあと if 文を書かないといけなかったのが全部 if 文の中に収まる。 えらい。
plus{}
って何?関数オブジェクト というやつ
基本的には
のようなものだと思っておくと良い
+
などの演算子はたいてい関数ポインタとして渡せないため、その代わりのもの
plus<int> p;
でオブジェクトを作り、 p(1, 2)
のように関数適用できる
bind
って何?引数に定数を固定したり、複数の引数を 1 つにまとめた関数オブジェクトを生成できる
利用例 :
bind(uniform_int_distribution(1, 100), rng)
で uniform_int_distribution
に乱数生成機を固定できる
2 つの列を変換して総和を取りたいときも transform_reduce
でできるんですね〜
inner_product
のほうが 3 文字短い
istream_iterator
は istream
から入力した結果を返してくれるイテレータ
auto p = istream_iterator<int>(cin)
とすると、
*p
で現在の cin
の位置から整数 1 個を読んだ時の値を返す
p++
で cin
を整数 1 個分進める
ことができる
隣接 2 要素に対して何かを計算したい時にも使える
vector::erase_if
は残念ながら C++20 から
代わりに remove_if
を使う
利用例 : 前半と後半を入れ替える
https://codeforces.com/contest/1381/submission/87563323
言語仕様を把握して実装力を上げよう!
明日は Hyado さんが変なmodについて書くようです!楽しみ〜
MMNMM さんがどこかの問題で next_permutation
と inner_product
を使ってめちゃくちゃ賢い実装をしていた記憶があるんですが、どこにあるでしょうか……