get_or_insert_with

本文介绍了Rust编程语言中的get_or_insert_with方法,它简化了在集合中查找并插入键值对的过程。在处理自定义数据结构Node时,get_or_insert_with用于构建字典树,避免了冗余的查找和插入操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

get_or_insert_with 是 Rust 中集合类型(如 HashMapHashSet, 或某些自定义类型如 BTreeMap)提供的方法之一,用于处理“如果不存在则插入”的场景。它旨在简化在集合中查找某个键(key),如果该键不存在,则使用给定闭包(closure)提供的值来初始化并插入键值对的操作。这样,程序员可以避免先检查键是否存在,再决定是否插入,而是通过一个简洁的方法调用来完成这一系列操作。

get_or_insert_with 被用于一个自定义的数据结构 Node 的嵌套结构中,具体解释如下:

fn insert(&mut self, word: &str) {
    let mut node = &mut self.root; // 初始化指向根节点的可变引用

    // 逐个字符插入
    for c in word.as_bytes() {
        let index = (c - b'a') as usize; // 计算字符在子节点数组中的索引

        // 获取或插入子节点
        let next = &mut node.children[index];
        node = next.get_or_insert_with(Box::<Node>::default);
    }

    node.end = true; // 标记当前节点为单词结束节点
}

  • 在这个上下文中:

  • node 是一个指向当前内部节点的可变引用。
  • children 是当前节点的子节点数组。
  • next 试图获取 node.children[index] 处的子节点的可变引用。
  • get_or_insert_with(Box::<Node>::default) 执行以下逻辑:
    • 如果 node.children[index] 已经存在(即非 None),那么直接返回其可变引用。
    • 如果 node.children[index] 不存在(即 None),则调用 Box::<Node>::default() 创建一个新的 Node 对象(默认实例化),将其封装在一个 Box 中,并将这个 Box<Node> 插入到 children[index] 位置,最后返回新插入节点的可变引用。

通过这种方式,循环遍历输入字符串 word 的每个字符时,会确保沿着路径创建所有必要的子节点(如果它们尚不存在的话),最终达到插入整个单词的目的。get_or_insert_with 方法在此处有效地实现了自动构建字典树(Trie)的过程,同时避免了重复的查找和插入操作。

总之,get_or_insert_with 是一个便捷的工具方法,用于在集合中查找给定键,如果找不到则使用提供的闭包生成一个值插入到集合中,并返回与该键关联的新值或已存在的值的引用。在上述代码中,它被用于构建字典树结构,以支持高效地插入和查询单词。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值