【问题标题】:Equivalent of split_at_mut for HashMap?HashMap 的 split_at_mut 等价物?
【发布时间】:2020-10-03 17:27:44
【问题描述】:

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

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_ontoHashSet 中删除由于u 而合并到merge_onto 的所有顶点。因此,代码如下所示:

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

【问题讨论】:

  • 您要在这里解决的真正问题是什么?我有一种感觉,这是XY problem 的一个示例,并且可能有更好的方法来解决实际问题,而不是您在这里尝试做的事情。
  • 谢谢,这是一个很好的观点。我编辑了这个问题,希望让它更清楚。

标签: rust borrow-checker


【解决方案1】:

不,就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)
}

【讨论】:

    猜你喜欢
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 2013-11-04
    • 1970-01-01
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多