代码之家  ›  专栏  ›  技术社区  ›  Tony

如何插入或更新RBtree RS中的RBtree?

  •  0
  • Tony  · 技术社区  · 7 年前

    如果值是数据结构的一部分,我很难理解如何以惯用方式查找、追加或创建新的向量,在本例中是红黑树。

    我在用 this Red Black Tree implementation 计划是获取一个可变的值引用,如果它存在,我将附加到该值(而不是 None )创建一个新的向量并将其移动到 RBTree 如果键没有值。我的代码看起来是这样的,为了简洁,稍微修改了一下,所以请原谅任何粗心的错误:

    struct Obj {
        tree: RBTree<i32, Vec<String>>,
    }
    
    let mut obj = Obj {
        tree: RBTree::new(),
    };
    
    let k = 5;
    let v = "whatever";
    
    match obj.tree.get_mut(k) {
        None => {
            let mut vec: Vec<Node> = Vec::new();
            vec.push(v);
            book.tree.insert(k, vec);
        }
        Some(vec) => vec.push(v),
    }
    

    问题是,当我检查树是否存在时,我得到了一个可变的引用,因为如果它确实存在,我想通过附加到向量来对它进行变异。但是,如果它不存在,我想插入一个新的节点,该节点尝试执行可变借用,因此在这一行上得到“第二个可变借用发生在这里” book.tree.insert(k, vec); .

    我希望能够深入了解如何执行这个查找或创建,以便它能够编译并且是线程安全的。我想我使用的图书馆也可能有问题。还没有资格对此发表评论。

    1 回复  |  直到 7 年前
        1
  •  0
  •   Kornel    7 年前

    在这种情况下,解决方法是将变化的代码移出 get_mut() 的范围。

    let needs_insert = match obj.tree.get_mut(k) {
        None => true,
        Some(vec) => {
            vec.push(v); 
            false
        }
    };
    
    if needs_insert {
        book.tree.insert(k, vec![v]);
    }
    
    推荐文章