gpt4 book ai didi

hashmap - 在两个 HashMap 之间交换值

转载 作者:行者123 更新时间:2023-11-29 08:03:47 27 4
gpt4 key购买 nike

编辑注意:此代码现在可以编译,请参阅 What are non-lexical lifetimes? .


我有两个 HashMap,并且希望在某些条件下在它们之间交换值。如果第二个 HashMap 中不存在该键,则应将其插入。我不想克隆该值,因为那太昂贵了。

不起作用的(简化的)关键代码如下:

use std::collections::HashMap;
use std::collections::hash_map::Entry;
use std::mem;

#[derive(Debug)]
struct ExpensiveStruct {
replace: bool,
// imagine a lot of heap data here
}

fn main() {
let mut hm : HashMap<usize, ExpensiveStruct> = HashMap::new();
let mut hm1 : HashMap<usize, ExpensiveStruct> = HashMap::new();

let dummy = ExpensiveStruct { replace: false };

hm.insert(1, ExpensiveStruct { replace: true});
hm1.insert(1, ExpensiveStruct { replace: true});

match hm1.get_mut(&1) {
Some(ref mut x) =>
match hm.entry(1) {
Entry::Occupied(mut y) => { if y.get().replace {
mem::swap(x, &mut y.get_mut());
}
},
Entry::Vacant(y) => { y.insert(mem::replace(x, dummy)); }
},
None => {}
}

println!("{:?}", hm);
}

(在 Rust Playground 上)

我收到错误:

error[E0597]: `y` does not live long enough
--> src/main.rs:28:9
|
23 | mem::swap(x, &mut y.get_mut());
| - borrow occurs here
...
28 | },
| ^ `y` dropped here while still borrowed
29 | None => {}
30 | }
| - borrowed value needs to live until here

我对这个借用问题真的很困惑,而且我没有找到解决它的方法。如果我将 Entry 替换为 match hm.get_mut(1),则无法在 None 情况下插入,因为匹配可变地借用了HashMap

最佳答案

您在应该提供引用文献的地方提供了引用文献。

&mut y.get_mut()

例如是

&mut &mut ExpensiveStruct

并且您遇到了类似的问题

match hm1.get_mut(&1) {
Some(ref mut x) =>

当类型缩减为 &mut ExpenseStruct 时,您的代码将按预期工作:

match hm1.get_mut(&1) {
Some(x) => match hm.entry(1) {
Entry::Occupied(mut y) => if y.get().replace {
mem::swap(x, y.get_mut());

( On the Playground )

请注意,ref mut 已被删除,因为 hm1.get_mut(&1) 已经为可变引用返回了一个 Option,并且&mut 已删除,因为 y.get_mut() 已返回引用。

关于hashmap - 在两个 HashMap 之间交换值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46434688/

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