はじめに
競プロではC++の利用者が圧倒的に多い中、私はJavaScriptでAtCoderのコンテストに参加しています。理由は、競プロを始めようと思ったときに、新しくC++を勉強するよりも、使い慣れた言語で手っ取り早く競プロを始めたかったからです。JavaScriptはC++と比べると実行速度が遅い言語ではありますが、適切に実装すれば、大半の問題では制限時間を超えてしまうことはないと感じています。しかし、ときどきC++との大きな差を感じざるを得ない場面もあります。
C++のSTLが使いたくなるとき
JavaScriptにはArray・Set・Mapなどのデータの集合を扱うためのクラスが用意されていますが、C++のSTLに比べると種類や機能が貧弱です。例えば、JavaScriptでキューを使いたいときはArrayで代替することになりますが、先頭の要素を取り出すArray#shift
は計算量がO(n)
のためかなり低速です[1][2]。また、C++のstd::set
のように要素が常にソートされているクラスも用意されていません。もし、STLにあってJavaScriptにはないクラスが必要になったら、自前で実装しなければなりませんが、それはかなり大変です。
tstlとは
JavaScriptでやるのもそろそろ限界かと思いながら、いろいろと調べていると、AtCoderのTypeScript環境にはtstl
というライブラリがインストールされていることに気が付きます[3]。tstl
はC++のSTLをTypeScriptに移植したライブラリとのことで、これは非常にありがたいです。JavaScriptでSTLにあるものと同等のクラスを使うことができれば、上記の問題は解決できます。
【リポジトリ】https://github.com/samchon/tstl
【API一覧】https://tstl.dev/api/modules/std.html
tstlを使うときの注意点
tstl
はTypeScript環境にしかインストールされていないため、JavaScriptユーザーがtstl
を使う場合は、提出言語をTypeScriptに指定する必要があります。また、リポジトリのREADMEではデフォルトインポートが使用されていますが、AtCoderがインストールしているtstl
のバージョンではデフォルトインポートに対応していないようなので、名前付きインポートを使用します。
import * as std from 'tstl'; // すべての名前つきエクスポートをまとめてインポートする