2014-08-30 20 views
10

Sto osservando il linguaggio di programmazione Rust e sto provando a convertire il mio pensiero C++ in Rust. Strutture dati comuni come liste e alberi e sono state precedentemente implementate con puntatori in C++ e non sono sicuro di come implementare gli equivalenti esatti in Rust. Le strutture dati a cui sono interessato sono gli algoritmi intrusivi, simili a quelli che si trovano nelle librerie intrusive di Boost, e questi sono utili nella programmazione embedded/di sistema.Equivalenti algoritmi intrusivi in ​​Rust

L'esempio di elenco collegato in Rust (Dlist) è praticamente semplice, ma utilizza un tipo di contenitore in cui il tipo effettivo si trova all'interno del contenitore. L'algoritmo intrusivo che sto cercando è un po 'il contrario: si ha un tipo principale in cui il nodo della lista è inserito o ereditato.

Inoltre, la famosa lista collegata in Linux è anche un altro esempio in cui i dati dell'elenco sono nei membri delle strutture. Questa è come la variante del membro Boost degli algoritmi intrusivi. Ciò consente di utilizzare il tuo tipo in più elenchi/alberi molte volte. Come funzionerebbe con Rust?

Quindi non sono sicuro di come convertire questi tipi di motivi di progettazione in Rust a cui sono abituato in C/C++. Chiunque abbia avuto successo a capirlo?

+0

Non ho molta esperienza con questi tipi di strutture dati, ma puoi spiegare alcuni dei benefici che speri di ottenere usando? Se le strutture standard di ruggine non si adattano ai tuoi casi d'uso, forse qualcos'altro lo farà. – Shepmaster

+0

Si consiglia di consultare https://github.com/pcwalton/multilist, che implementa una infrastruttura intrusiva. – awelkie

risposta

1

Rust vuole che tu pensi alla proprietà e alla vita. Chi possiede i membri e per quanto tempo vivranno?

Nella domanda di Dlist, la risposta è "il contenitore". Con algoritmi intrusivi non c'è una risposta chiara. I membri di una lista possono essere riutilizzati in un'altra lista, mentre altri vengono distrutti con la prima lista. In definitiva, probabilmente si desidera utilizzare il conteggio dei riferimenti (std::sync::Arc).

1

Penso che ci siano due modi per realizzare qualcosa del genere in Rust. Diamo un'occhiata all'implementazione di grafici, che in genere utilizzano collegamenti intrusivi.

Il primo approccio si basa su Rc<RefCell<Node>>. Puoi trovare maggiori dettagli qui: Graphs and arena allocation

Il secondo approccio si basa su indici vettoriali. Puoi trovare maggiori informazioni qui: Modeling Graphs in Rust Using Vector Indices.

Credo che il secondo approccio sia migliore, ma non ho effettuato alcun test.