this post was submitted on 15 Mar 2025
21 points (95.7% liked)
Rust
6697 readers
102 users here now
Welcome to the Rust community! This is a place to discuss about the Rust programming language.
Wormhole
Credits
- The icon is a modified version of the official rust logo (changing the colors to a gradient and black background)
founded 2 years ago
MODERATORS
you are viewing a single comment's thread
view the rest of the comments
view the rest of the comments
Basically, if your tree is static or you only add nodes, the easiest option is to store all nodes in a Vec and have the child/parent links be indices. I recommend the typed-index-collection crate if you go that route.
If you need to move/delete nodes a lot then either Rc<Refcell< or you can wrap the Vec in something that takes care of the admin of fixing up pointers.
E.g. see this crate https://crates.io/crates/orx-tree
If you want to get really fancy you can even do things like compacting GC. You're basically implementing a memory allocator at that point.
Note that you might say "what's the point of Rust if I just have to implement a memory allocator to bypass the borrow checker?" but that's silly. You still get the benefits of Rust for the rest of your code, and Rust still prevents things like type confusion and UB.
Thanks, I'll look at the box-tree crate, but I'd say using indices instead of pointers is somewhat unsatisfying. C++'s advertised property is zero-cost abstractions, and Rust is supposed to have C++'s performance without the footguns. But if you compare those vector index operatons with primitive pointer dereferences, there are a bunch of extra instructions run at each operation, including a layer of memory lookups that can cause cache pressure and misses.
I think the most practical answers I've heard so far are to 1) use Rc/Arc and weakrefs, or 2) use unsafe operations on machine pointers in a hopefully carefully contained and abstracted part of the code.
Sorry about the slow responses as I'm occupied with RL stuff most of the time for now.
@FizzyOrange
Wow, this crate looks like the most feature-rich tree crate I've ever seen!
It seems very underrated (only ~1000 downloads and one star on GitHub (by me)).
Thank you for the suggestion!😊
#Rust #RustLang #DataStructure #Tree #Algorithms