読者です 読者をやめる 読者になる 読者になる

情報オリンピックで使う言語の比較

Programming JOI

まずは140文字で要約:

  • 情報オリンピックで使う言語はC++ > Java > C。特にCはライブラリの不足が激しい。ヒープとか覚える気がないならCはやめたほうがいい。Javaが有利なのは多倍長と幾何だがあまり出ない。その他の点ではC++が良い。つまりC++がおすすめ。

Javaの良い点。

Javaが良いのは、C++にないライブラリをいくつかもっていること。

  1. java.mathパッケージにある多倍長ライブラリ
  2. java.awtやjava.awt.geomパッケージにある幾何ライブラリ

これらが必要になることはあまりないが、たまに便利である。

C/C++の良い点。

C/C++が良いのは、計算分野においてはJavaより一般に高速であること。
Javaリテラル(整数、小数、文字、真偽値)以外の値をすべて参照でもつので、C/C++で言うところのmallocを頻繁に呼ぶことになり、不都合である。
アルゴリズムの問題は、C/C++では上手に書けばmallocを1度も使わないで書けることのほうが多い。

おそらくこの点において差がでるのではないかと思う。(検証してはいない)

Cの良い点。

コンパイルが速くて正確であること。
(ぶっちゃけアルゴリズムにおいてはあまり関係ない。)

ただ、C++オリジナルのライブラリの一部はC由来のライブラリより遅いことが知られている。
特にiostream関連は遅いのでstdio.hのものを使用するほうがよい。

C++の良い点。

Javaと比べて、例えばSTLのnext_permutationはJavaにはない。

しかし、C++の魅力は、何といってもSTLの利便性である。

  • binary_search系,priority_queue,sortなどのライブラリは比較を行うが、pairやfunctionalなどを用いて上手に書けば殆どの場合で比較関数を自分で書く必要がない。
  • Javaと違って加減乗除や[]などの演算子オーバーロードがされているので、その分自然に書ける。(vectorやcomplexなど)

まあ他にも、JavaやCと比べてストレスなく書けることが多く、大変おすすめである。

C++覚えるの時間かかる><」という問いについて。

ぶっちゃけ、必要なところだけピンポイントで覚えればいいと思う。クラスが作れなくても、使えれば問題ない。

STLで、例えば以下のようなライブラリの使用方法がわかればよい。

  • vector(可変長配列)
    • deque(双方向キュー)が万能なので、stackやqueueは覚えなくてもいいと思う。
  • priority_queue(優先順位つきキュー)
  • pair(ペア) ペアの順序関係を理解しておくと便利。
  • sort(整列)
  • lower_bound,upper_bound,equal_range,binary_search(二分探索四姉妹)
  • map, set (マップとセット)
  • list(連結リスト)

STLすらわからなくても、最悪CモドキとしてもCより便利なことが多いので、C++の使用をおすすめする。