在Rust中使用相同功能对哈希映射进行就地修改,插入或删除

low

假设我有一个哈希映射m: HashMap<K, V>,一个键k: K和一个值v: V,并希望执行以下操作:

  • 如果m不包含在索引值k,插入v索引k
  • 如果在index处m包含一个值w则将k函数fn combine(x: V, y: V) -> Option<V>应用于vw,以及:
    • 如果结果是None,请k从中删除索引的条目m
    • 如果结果是Some(u),在指数更换价值ku

有没有一种方法可以“就地”执行此操作,而无需调用k多次访问,修改或删除该值的函数

我也想避免复制数据,因此最好不应该需要克隆v的克隆送入insertcombine分开。

我可以重写combine以使用(可变)引用(或内联它),但仍然存在不复制数据的愿望。

low

深入研究Entry文档,我注意到Entry枚举的变体提供了用于就地修改,删除或插入条目的功能。

考虑std::collections::hash_map::Entry范围之后,可以执行以下操作:

match m.entry(k) {
    Entry::Occupied(mut oe) => {
        let w = oe.get_mut();
        match combine(v, w) {
            Some(u) => { *w = u; },
            None    => { oe.remove_entry(); },
        }
    },
    Entry::Vacant(ve) => { ve.insert(v); },
}

是Rust游乐场中的PoC。)

但是,这需要combine将(可变)引用作为其第二个参数(在我的情况下很好)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Bonfire使用什么功能对密码进行哈希处理?

如何在OpenCV中使用双型映射进行重新映射

使用随机映射进行Oracle更新

在R中使用过滤功能对列进行操作

如何在替换文本中使用lmap映射进行替换?

在实体框架中使用流畅映射进行一对多

在 AWS API Gateway 中使用基本路径映射进行版本控制

Rust:在哈希映射参考中插入uint

Java使用Stream按值对映射进行排序

更改CSV文件,使用动态映射进行读写

如何使用字典映射进行值校正?

斯威夫特:如何以枚举为键对哈希映射进行编码?

如何在FS2中使用分类器功能对对象进行分组?

在Cassandra中使用对象映射器进行批量插入

Hibernate:使用映射进行映射并获取参数类型不匹配

基于Automapper约定的映射进行收集

对pair和double的映射进行排序

如何在 rust 中使用 struct 制作一种类型的哈希映射

使用窗口功能对记录分组进行排序并选择最小值时,如何删除重复项?

在Material UI中使用Component Lab>自动完成功能对SVG图标进行编译错误

如何在AngularJS指令中使用编译功能对服务中的ng-repeat元素进行处理

在spatstat中使用“信封”功能对空间点模式超帧进行基于仿真的假设检验

使用docker-compose和端口映射进行本地Kafka测试

如何使Visual Studio Code使用路径映射进行自动导入?

使用来自Browserify和Typescript的源映射进行Webstorm调试

使用Google App Engine或Lucene通过关键字映射进行搜索

如何在Javascript中使用异步等待功能对象?

使用gdx功能对libgdx进行单元测试

不使用内置功能对列表进行排序