Ho una piccola struttura che contiene solo un i32
:Come posso implementare Ord quando il confronto dipende da dati che non fanno parte degli articoli confrontati?
struct MyStruct {
value: i32,
}
Voglio realizzare Ord
per immagazzinare MyStruct
in una o di qualsiasi altra struttura dati BTreeMap
che richiede di avere Ord
sui suoi elementi.
Nel mio caso, confrontando due istanze di MyStruct
non dipende sui value
s in loro, ma chiedendo un'altra struttura di dati (un dizionario), e che la struttura dei dati è unico per ogni istanza del BTreeMap
creerò. Quindi idealmente sarebbe simile a questa:
impl Ord for MyStruct {
fn cmp(&self, other: &Self, dict: &Dictionary) -> Ordering {
dict.lookup(self.value).cmp(dict.lookup(other.value))
}
}
Tuttavia questo non sarà possibile, dal momento che un Ord
implementazione solo è possibile accedere a due istanze di MyStruct
, niente di più.
Una soluzione potrebbe memorizzare un puntatore al dizionario in MyStruct
ma è eccessivo. MyStruct
dovrebbe essere un semplice wrapper e il puntatore raddoppierà le sue dimensioni. Un'altra soluzione è usare un sistema statico globale, ma neanche questa è una buona soluzione.
In C++ la soluzione sarebbe semplice: la maggior parte degli algoritmi/strutture di dati STL consente di passare un comparatore, dove può essere un oggetto funzione con uno stato. Quindi credo che Rust avrebbe un idioma per abbinarlo in qualche modo, c'è un modo per farlo?
In realtà, in un ambiente a 64 bit, un puntatore sarebbe quadruplicare 'dimensione del MyStruct' da 32 bit a 128 bit (64 puntatori, 32 valori, 32 padding). –
Ti interessa l'effettivo ordine che hai finito, o stai semplicemente provando a mettere le istanze di 'MyStruct' in una mappa? Se fosse il secondo, avrebbe molto più senso usare un ['HashMap'] (https://doc.rust-lang.org/std/collections/struct.HashMap.html) – TheHansinator
Oh, bene, per il bene della domanda assumiamo che abbiamo bisogno dell'ordine. Immagino che un problema simile si verificherebbe con un 'BinaryHeap' se è necessario inserire il valore min/max di volta in volta. – loudandclear