水色C++コーダーがRustで50問解いて思ったこと

結論:Rustはおすすめ

2023年08月12日

2週間ほど前からRustでAtCoderの問題を解いています。 ABSとABC300~313のABC埋めが終わったので、初学者なりに感じたことをまとめてみます。

筆者のバックグラウンドとしては数年前にC++を使って水色に到達し、その後ずっと放置していましたが最近復帰し言語を変えてみたという経緯です。

Rustを使おうか迷っている人の参考になれば幸いです。

幸せなところ

一応個人的に重要だと思う順に並んでいます。

エラーメッセージが丁寧

Segmentation Fault.

C++erならこのメッセージと格闘したことがない人はいないでしょう…競プロなら大体範囲外アクセスです。

Rustならどこで範囲外アクセスが起きたのか教えてくれます。もっと言えばイテレーションを使えば良いことも多いので、そもそも添字アクセスする機会すら少なくなります。最高です。

強い人がいる

自分は新しい言語で競プロをするときは、

  1. まず自分でACする
  2. その言語で強い人のコードを見て真似する

という方法をとります。 その言語特有の書き方や便利な標準ライブラリなど学べることがとても多いからです。

Rustだと自分は特にsansenさんを参考にしています。 コードがスマートですし、赤コーダーかつABC312では1位を取るなど実力も凄まじいです。参考にできる人がいるというのは大事ですよね。

ツール群が便利

Rust Bookにもある通りRustは開発ツールが整備されています。

Cargo

CargoはRustの依存関係管理ツール兼ビルドツールで、ライブラリやツールを導入したいと思ったら大抵はCargoで解決できます。

Rustfmt

Rustfmtという標準フォーマッタが用意されており、簡単に導入できます。自分は実装が苦手なのもあり愛用しています。

(参考:実装力で戦える! ~競プロにおける実装テクニック14選~, @e869120

rust-analyzer

rust-analyzerによってメソッドのサジェストや型推論、コンパイルエラーもほぼ事前に教えてくれるなどとにかくコーディングが楽になります。

(参考:rust-analyzerを使ってみたら思いのほか素敵だったので紹介してみる, @simonritchie

辛いところ

文字列の扱いが複雑

そもそもString&strは違うとか、結合はString&strじゃないとできないとか、Stringはコピーできないからクローンしろとか…文字列に関しては今も苦しんでいます。

幸いAtCoderではproconioが使えて、入力でproconio::marker::Charsとして受け取ればC++のStringチックに扱えるので最近はもっぱらそうしています。

所有権が難しい

Rustではメモリ管理のためにmalloc/freeやGCを採用せず所有権という仕組みを採用しています。

これがびっくりするくらい難しい。moveできないとかborrowできないとかこれはsecond borrowだからダメだとか…

こればっかりはもうちょっと仲良くならないといけないな、と感じます。

C++じゃない

当然ですが、RustはC++ではありません。

競プロの解説には大抵C++はありますがRustはありません。Qiitaなんかの記事の参考実装もC++であることがほとんどです。世界最強touristのコードを参考にしようにもC++です。

Rustに限らずC++以外で競プロをやると立ちはだかる壁だとは思いますが、今までC++でやっていただけに少しストレスです。

まとめ

総評としては満足で、今後もRustを使っていこうと思っています。

幸せになれる点も多いですし、個人的には記法も好みでかなり気持ちよくコーディングできています。辛い点も最後の点以外は勉強すれば解消していけると前向きに捉えています。

Rust、おすすめです。

参考