gpt4 book ai didi

rust - 如何实现对二叉搜索树右边缘值的可变引用的迭代器?

转载 作者:行者123 更新时间:2023-11-29 07:49:56 25 4
gpt4 key购买 nike

我在 Rust 中实现了一个简单的二叉搜索树(遵循 CIS 198,这很棒),为了学习,我正在做的迭代器只是通过右边缘运行。

我无法实现提供可变引用的迭代器。我尝试了很多方法,但没有一个被 Rust 编译器接受。我需要帮助的代码是下面的 (while I made a gist with the complete code here):

#[derive(Debug)]
pub struct Tree<T>(Option<Box<Node<T>>>);

#[derive(Debug)]
pub struct Node<T> {
elem: T,
left: Tree<T>,
right: Tree<T>,
}

// MUTABLE BORROW STRUCT
pub struct IterMut<'a, T: 'a> {
next: &'a mut Tree<T>,
}

// MUTABLE BORROW NEXT (I'M STUCK HERE, NOTHING WORKS)
impl<'a, T> Iterator for IterMut<'a, T> {
type Item = &'a mut T;
fn next(&mut self) -> Option<Self::Item> {
// 1 try: cannot infer lifetime
self.next.0.as_mut().map(|node| {
self.next = &mut node.right;
&mut node.elem
})

// 2 try: node.right, node.elem does not live long enough
self.next.0.take().map(|node| {
self.next = &mut node.right;
&mut node.elem
})
}
}

最佳答案

您需要更改字段类型 IterMut::nextOption<&'a mut Node<T>> :

pub struct IterMut<'a, T: 'a> {
next: Option<&'a mut Node<T>>,
}

impl<'a, T> Iterator for IterMut<'a, T> {
type Item = &'a mut T;
fn next(&mut self) -> Option<Self::Item> {
self.next.take().map(|node| {
self.next = node.right.0.as_mut().map(|node| &mut **node);
&mut node.elem
})

}
}

您可以找到有关递归数据结构的可变迭代器实现的更多有用信息 in the IterMut chapter of Learning Rust With Entirely Too Many Linked Lists .

关于rust - 如何实现对二叉搜索树右边缘值的可变引用的迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38089723/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com