如何使用键的引用更新HashMap中的条目?

3

我正在编写一个函数,该函数可以将值插入或更新到结构中的 HashMap 中。我的 Map 的类型为 HashMap<String, Value>,其中的 Value 是在我的程序中定义的枚举类型。我在我的结构体上有一个名为 bind(&mut self, name: &str, value: Value) 的函数,它可以将一个条目插入或更新到 HashMap 中。目前我的代码看起来是这样的:

pub fn bind(&mut self, name: &str, value: Value) -> /* snip */ {
        /* snip */

        self.bindings.insert(name.to_string(), value);

        /* snip */    
}

如果哈希表中没有name这个键,那么这样做就没问题了,但是如果已经存在该键,是否有可能避免调用to_string并为已经拥有的字符串分配更多内存,而是直接更新现有条目呢? 我想要做的事情就像这样:

pub fn bind(&mut self, name: &str, value: Value) -> /* snip */ {
        /* snip */

        if (self.bindings.contains(name)) {
                // this update method does not exist
                self.bindings.update(name, value);
        } else {
                self.bindings.insert(name.to_string(), value);
        }        
        
        /* snip */    
}

使用当前的API,您基本上是在分配克隆和多次重新计算哈希之间进行交易。 - loganfsmyth
1个回答

2
你可以使用HashMap::get_mut来获取值的引用(如果存在),这允许你修改它 - 特别是通过分配一个新值。 Playground

谢谢!这正是我在寻找的,它在我的基准测试中提高了10-15%的性能,所以这绝对比每次调用to_string要好。 - Rafael
@Rafael,还要看一下Entry API,它可以使代码更加简洁。 - egerhard
4
很遗憾,对于这种情况,入口API无法帮助OP,因为它无条件地要求一个拥有的密钥,而这正是OP想要避免的。 - user4815162342

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接