4
4

More than 3 years have passed since last update.

【Atcoder】JavaScriptでもC++のSTLが使いたい!

Last updated at Posted at 2021-09-06

はじめに

競プロでは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'; // すべての名前つきエクスポートをまとめてインポートする
4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4