Rustコトハジメ

プログラミング言語Rustと競プロに関する情報をお届けします。

【競プロ便利】HashMapを使って数え上げをする時にEntry APIを使おう

競プロでよくある前処理が、与えられた配列の中で、どの要素が何個あるか辞書を使って調べるというものですが、ふつうは、

for x in xs:
  if !x in h then h[x] = 0
  h[x] += 1

のように書きますが、Rustではもう少し楽な書き方があります。

Rustは参照の寿命を管理していますから、自分の中のデータ構造をmut参照で返しても、書き換える人が1人であることは保証出来ます。つまり、いつまでも参照がそこらでふわふわと放浪して、理解不能な書き換えに繋がることがないということです。

この利点を利用したのがEntry APIです。

上のコードは、Rustでは以下のように書けます。

fn main()
{
    let mut xs = vec![1,2,3,1,2,3];
    let mut h = std::collections::HashMap::new();
    for x in xs {
        *h.entry(x).or_insert(0) += 1;
    }
    dbg!(&h);
}
[prog.rs:11] &h = {
    2: 2,
    3: 2,
    1: 2,
}

さぁみなさん、Rustを使いましょう。ライブラリはこれ使ってもいいよ。

GitHub - akiradeveloper/rust-comp-snippets