はじめに
弊社ではRustが主要開発言語になっています。
私はRustが何もわからなかったので、せっかくなら競プロを再開するついでに使ってみようと考えました。そこから1年ちょっと経ち、なんやかんやあって青コーダーになれたので、1年間何をやったのか振り返って、結局何ができるようになって何ができないままなのかを紹介します。
2021年の6月からRustを使い始めています。Rustで1000問解いたみたいです。
結論
- できるようになったこと
-
HashMap
,BTreeSet
,BinaryHeap
,VecDeque
などのデータ構造が困らない程度に使えるようになった -
Option
のmap
メソッドやIterator
のsum
メソッドなどで(forやifを使用せずに)簡単に書けるようになった
-
- できるようにならなかったこと
- 非同期処理, 並列処理
- ライフタイムの理解
- ファイル入出力
- 1.42よりも新しいもの
- オンラインジャッジシステムのバージョンが1.42なので......
- Rustらしい書き方
- 解くだけなら動けばOKなので、どう書くのがRust的なのかは身につきませんでした
要するに、競プロで要求される程度のことができるようになりますが、使わないものはできるようになりません(それはそう)。でもググって見つけたコードを読んだりコンパイルエラーに対処する能力は上がっている気がします。
やったこと
-
普通に解く
コンテストの問題を普通に解きました。この時点で- usize型はマイナスになった瞬間にpanicするので不等号の比較はなるべく足し算で行う
- 文字列型のn文字目を
s.chars().nth(n).unwrap()
でとると遅いのでs.chars().collect::<char>()
のようにしてベクタで保持しておく -
for v_i in v
みたいに書くとmoveされるのでfor &v_i in &v
みたいに書く
あたりを知りました。
-
シンプルな関数・構造体を自作ライブラリとして整備する
簡単なアルゴリズムをwikipediaなどから引っ張ってきて実装しました。疑似コードをそのまま書いた感じでRust特有の問題は特に踏まなかったのですが、ドキュメンテーションコメントを書くのは楽しかったです。- UnionFind
- 最大公約数、素因数分解など
- modint
-
ちょっと複雑な関数・構造体を自作ライブラリとして整備する
型パラメータを受け付けるものを整備し始めました。- 二分探索
- クロージャを引数に渡すようにしましたが、クロージャで型パラメータが必要なんだぁとなりました
- セグメント木
- 木に乗せる型も演算する関数も型パラメータです。結構頑張って実装しました
- 二分探索
おわりに
12/24(土)に弊社主催のABCがありますのでよろしくお願いします!!!!!!!!