Ich habe vor kurzem begonnen, ein kleines Grafikprogramm von C++ nach Rust zu portieren. In diesem nutze ich einen Quad-Tree-Store dynamisch erstelltes Terrain. Je nach LOD und Position werden Knoten hinzugefügt und aus dem Baum entfernt. Angenommen, ich verwende ein Enum zur Darstellung des Baumes, was ist der beste Ansatz zum Hinzufügen und Entfernen von Knoten?Kanonische Implementierung von veränderbaren Bäumen
5
A
Antwort
1
Würde etwas in dieser Richtung für Sie arbeiten? Dies ist ein generischer Baum, den ich gerade als Beispiel gemacht habe, aber Sie können den dynamischen Vektor (Vec) durch einen festen ersetzen, wenn das Ihr Domain-Problem ist (Quad-Tree).
use std::slice::Items;
enum Node<V> {
Parent(Vec<Node<V>>),
Leaf(V),
}
struct NodeIter<'a, V> {
stack: Vec<Items<'a,Node<V>>>,
}
impl<'a, V> NodeIter<'a, V> {
fn from(node: &'a Node<V>) -> NodeIter<'a, V> {
let mut stack = Vec::new();
match node {
&Parent(ref children) => stack.push(children.iter()),
&Leaf(_) =>()
}
NodeIter {
stack: stack
}
}
}
impl<'a, V> Iterator<&'a V> for NodeIter<'a, V> {
fn next(&mut self) -> Option<&'a V> {
while !self.stack.is_empty() {
match self.stack.mut_last().unwrap().next() {
Some(&Parent(ref vec)) => {
self.stack.push(vec.iter());
},
Some(&Leaf(ref v)) => {
return Some(v)
},
None => {
self.stack.pop();
}
}
}
None
}
}
impl<V> Node<V> {
fn append<'a>(&'a mut self, n: Node<V>) -> Option<&'a mut Node<V>> {
match self {
&Parent(ref mut children) => {
let len = children.len();
children.push(n);
Some(children.get_mut(len))
},
&Leaf(_) => None,
}
}
fn retain_leafs(&mut self, f: |&V|->bool) {
match self {
&Parent(ref mut children) => {
children.retain(|node| match node {
&Parent(_) => true,
&Leaf(ref v) => f(v),
})
},
&Leaf(_) =>(),
}
}
fn iter<'a>(&'a self) -> NodeIter<'a, V> {
NodeIter::from(self)
}
}
fn main() {
let mut tree: Node<int> = Parent(Vec::new());
{
let b1 = tree.append(Parent(Vec::new())).unwrap();
b1.append(Leaf(1));
b1.append(Leaf(2));
b1.retain_leafs(|v| *v>1);
}
{
let b2 = tree.append(Parent(Vec::new())).unwrap();
b2.append(Leaf(5));
b2.append(Leaf(6));
}
for val in tree.iter() {
println!("Leaf {}", *val);
}
}
Verwandte Themen
- 1. Was ist die "beste" kanonische Implementierung von Equals() für Referenztypen?
- 2. Verknüpfen von binären Bäumen
- 3. Umschreiben von Bäumen
- 4. Bereichsabfragen mit B-Bäumen und B + -Bäumen
- 5. Markieren von Bäumen in Haskell
- 6. Entwurf von unveränderlichen, typisierbaren Bäumen
- 7. Beispiel Verwendungen von Judy Bäumen
- 8. Verstehen von Bäumen in ANTLR
- 9. kanonische Darstellung eines BigDecimal
- 10. Erstellen von Vererbungsdiagrammen/-bäumen für Django-Vorlagen
- 11. htaccess kanonische URL
- 12. kanonische Probleme Liste
- 13. Kanonische Methode zum Definieren von Vorwärtsausgabe-Iterator
- 14. Erstellen eines veränderbaren MessageDialogs
- 15. Korrekte Verwendung von veränderbaren/unveränderlichen Listen
- 16. Existenz von veränderbaren benannten Tupel in Python?
- 17. NSTableview von einem veränderbaren Array auffüllen
- 18. Zugriff auf Daten von veränderbaren Array
- 19. Kanonische URL in Python vergleichen?
- 20. C# Entitätsframework String Kanonische Funktionen
- 21. 301 Redirect vs kanonische Links?
- 22. Java-Sammlungen mit veränderbaren Objekten
- 23. Wie veränderbaren Textbereich mit Editor
- 24. Alloca Implementierung
- 25. Catamorphism und Bäumen durchqueren in Haskell
- 26. C++ - Intervallbaumalgorithmus-Implementierung finden
- 27. WIE MAN DIE FEATURE BEDEUTUNG mit Wald von Bäumen ETIKETT?
- 28. NHibernate - wie man eine Sammlung von Bäumen abbildet
- 29. Erzeugen von Scala-Code-Bäumen aus einem Scala-Compiler-Plugin
- 30. Was ist Tri-Node Umstrukturierung von AVL-Bäumen?