Rust のトレイトで、associated type (関連型) か generic type (ジェネリクス) のどちらを使うか迷ったときの指針

Rust にトレイトという機能があります。 自分でトレイトを作るときに、そのトレイトに関連するジェネリックな型が欲しくなることがしばしばあります。そんなときの選択肢として

  1. associated type (関連型)
  2. generic type (ジェネリクス、型パラメータ)

の2つがあると思います(2番に関しては、正しい呼称かどうか自信がないです。trait Foo<T> {} と定義したときの T のことを指しています)。そして、どちらを使っても自分のやりたいことを実現できるな……と気づくことがあります。そのようなときに、どちらを使うのが良いのか分からなくなることがよくあるので、忘れないようにエントリとしてまとめておきます。

Rust の BTreeSet / BTreeMap で最大値を素早く取得する方法

Rust で map を使いたいとき、選択肢として

のいずれかがあります。このうち前者の BTreeMap は、キーによってソートされた状態で値が格納されるので、いろいろ操作したあとに最小値がほしいとか、ある区間の中にある値たちがほしい、みたいな場面で役立ちます。

「最大値がほしい」という場合にも当然役立つのですが、どのように最大値を取得するのが効率が良いか、考えたことはあるでしょうか。調べてみたので、まとめておこうと思います。