gpt4 book ai didi

rust - HashMap 的 split_at_mut 等效吗?

转载 作者:行者123 更新时间:2023-12-03 11:41:35 25 4
gpt4 key购买 nike

考虑以下代码(最小示例):

use std::collections::HashMap;
fn main() {
let mut map: HashMap<usize, i128> = HashMap::new();
map.insert(1, -5);
map.insert(2, 6);
map.insert(3, 7);
for i in map.keys() {
if *i == 3 {
continue;
}
*map.get_mut(&3).unwrap() += map[i];
}
}

借用检查员会提示:

cannot borrow `map` as mutable because it is also borrowed as immutable

但是,在这种情况下,我可以确定我所做的突变不会干扰不可变引用。对于 Vec,我会在这里使用 split_at_mut - Rust 中的 HashMap 有等效的吗?

编辑:

正如评论所指出的,让我更具体地说明我想要解决的问题。我想实现将图中的顶点“合并”为一个顶点。为此,我创建了一个 HashMap:

pub mergedVerticesList: HashMap<usize, HashSet<usize>>

它应该从一个顶点映射到已合并到该顶点的所有顶点。由于这可以递归完成,因此当撤消 umerge_onto 之间的合并时,我想删除已合并到 merge_onto 中的所有顶点,因为来自 merge_ontoHashSetu。因此,代码如下所示:

for i in self.mergedVerticesList[v].iter() {
self.mergedVerticesList.get_mut(&merge_onto).unwrap().remove(i);
}

最佳答案

不,就 HashMap 而言,这是不可能的。您可以将单元格作为值来重新获得可变访问权限,但我强烈建议不要这样做。您不能将更改移出循环吗(它还可以节省每次迭代的重复查找)。一些东西的调子

use std::collections::HashMap;
fn main() {
let mut map: HashMap<usize, i128> = HashMap::new();
map.insert(1, -5);
map.insert(2, 6);
map.insert(3, 7);
let s = map.iter().filter_map(|(k, v)| if *k != 3 { Some(v) } else { None }).sum::<i128>();
*map.get_mut(&3).unwrap() += s;
println!("{:#?}", &map)
}

关于rust - HashMap 的 split_at_mut 等效吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64187018/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com