私はi32
を含む小さな構造体を持っている:比較項目が比較項目の一部ではないデータに依存する場合、どのようにOrdを実装できますか?
struct MyStruct {
value: i32,
}
私はBTreeMap
でMyStruct
を格納するためまたはその要素にOrd
を持っているあなたを必要とする他のデータ構造にOrd
を実装したいです。私の場合は
value
Sに依存しない
MyStruct
の2つのインスタンスを比較しますが、別のデータ構造(辞書)を求め、そのデータ構造は、私が作成されます
BTreeMap
のインスタンスごとに一意です。だから、理想的には、次のようになります。
impl Ord for MyStruct {
fn cmp(&self, other: &Self, dict: &Dictionary) -> Ordering {
dict.lookup(self.value).cmp(dict.lookup(other.value))
}
}
Ord
実装だけMyStruct
の2つのインスタンス、何よりもアクセスすることができますので、しかし、これは、できません。
解決策の1つはMyStruct
に辞書へのポインタを格納することですが、それは過剰です。 MyStruct
は単純なラッパーであり、ポインターはそのサイズを倍にします。別の解決方法は静的なグローバルを使用することですが、それは良い解決策ではありません。
C++のソリューションは簡単でしょう。ほとんどのSTLアルゴリズム/データ構造ではコンパレータを渡すことができます。コンパレータは、ある状態の関数オブジェクトになります。だから私はRustがこれに何とかマッチするイディオムを持っていると信じています、これを達成する方法はありますか?
を実際には64ビット環境では、ポインタが 'MyStruct'のサイズを4倍になります32ビットから128ビット(64ポインタ、32値、32パディング)。 –
あなたが実際に注文することに気をつけていますか、単に 'MyStruct'インスタンスをマップに配置しようとしていますか?後者の場合は、['HashMap'](https://doc.rust-lang.org/std/collections/struct.HashMap.html)を使用する方がはるかに意味があります – TheHansinator
ああ、そうです質問のうち、注文が必要であると仮定します。私は時々最小値/最大値をポップする必要があるならば、同様の問題が 'BinaryHeap'で起こると思います。 – loudandclear