はじめに
弊社ではRustが主要開発言語になっています。
私はRustが何もわからなかったので、せっかくなら競プロを再開するついでに使ってみようと考えました。そこから1年ちょっと経ち、なんやかんやあって青コーダーになれたので、1年間何をやったのか振り返って、結局何ができるようになって何ができないままなのかを紹介します。
結論
-
- できるようになったこと
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::()のようにしてベクタで保持しておく
for v_i in vみたいに書くとmoveされるのでfor &v_i in &vみたいに書く
あたりを知りました。
シンプルな関数・構造体を自作ライブラリとして整備する
簡単なアルゴリズムをwikipediaなどから引っ張ってきて実装しました。疑似コードをそのまま書いた感じでRust特有の問題は特に踏まなかったのですが、ドキュメンテーションコメントを書くのは楽しかったです。
UnionFind
最大公約数、素因数分解など
modint
ちょっと複雑な関数・構造体を自作ライブラリとして整備する
型パラメータを受け付けるものを整備し始めました。
二分探索
クロージャを引数に渡すようにしましたが、クロージャで型パラメータが必要なんだぁとなりました
セグメント木
木に乗せる型も演算する関数も型パラメータです。結構頑張って実装しました
おわりに
12/24(土)に弊社主催のABCがありますのでよろしくお願いします!!!!!!!!