【问题标题】:How can I update an entry in a HashMap with a refrence to a key?如何使用对键的引用来更新 HashMap 中的条目?
【发布时间】:2021-07-07 23:16:02
【问题描述】:

我正在编写一个函数,它可以将一个值插入或更新到作为结构一部分的 HashMap 中。 我的地图是HashMap<String, Value> 类型,其中Value 是我程序中其他地方定义的枚举。我的结构上有一个函数pub fn 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 还没有在 hashmap 中,这很好,但如果是,是否可以通过更新现有条目来避免 to_string 的开销,而不是调用 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,您基本上是在必须分配克隆和多次重新计算哈希之间进行权衡。

标签: performance rust


【解决方案1】:

您可以使用HashMap::get_mut 获取对该值的引用(如果存在),这允许您对其进行修改 - 特别是通过分配一个新值。

Playground

【讨论】:

  • 谢谢!这正是我一直在寻找的,在我的基准测试案例中性能提高了 10-15%,所以这绝对胜过每次调用 to_string
  • @Rafael 还可以查看Entry API,这可以使代码更简洁。
  • @egerhard 不幸的是,在这种情况下,入口 API 不会帮助 OP,因为它无条件地需要拥有的密钥,而这是 OP 想要避免的。
猜你喜欢
  • 2021-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-26
  • 2022-12-31
相关资源
最近更新 更多