【发布时间】:2020-05-21 07:11:07
【问题描述】:
我有一个简单的HashMap;说HashMap<char, char>。
有没有办法使用std::mem::swap(或任何其他方法)交换此哈希图中的两个元素?
当然,有一种简单的方法是用get 获取值,然后用insert 替换它们——但这会触发哈希器两次(一次用于获取,然后用于插入),我正在寻找一种方法- 执行第二次哈希调用(更多的是出于好奇而不是性能)。
我尝试的是这个(在几个版本中;没有一个有效 - 正如 cmets 中所说:entry 不会做我所期望的,即使我通过了编译器):
use std::collections::HashMap;
use std::mem::swap;
let mut hash_map: HashMap<char, char> = HashMap::default();
hash_map.insert('A', 'Z');
hash_map.insert('B', 'Y');
swap(&mut hash_map.entry('A'), &mut hash_map.entry('B'));
现在编译器会抱怨(我明白为什么会这样)
error[E0499]: cannot borrow `hash_map` as mutable more than once at a time
--> tests.rs:103:42
|
103 | swap(&mut hash_map.entry('A'), &mut hash_map.entry('B'));
| ---- -------- ^^^^^^^^ second mutable borrow occurs here
| | |
| | first mutable borrow occurs here
| first borrow later used by call
同样以这种方式获取两个值也或多或少以相同的方式失败:
let mut a_val = hash_map.get_mut(&'A').expect("failed to get A value");
let mut b_val = hash_map.get_mut(&'B').expect("failed to get B value");
swap(&mut a_val, &mut b_val);
有没有办法简单地交换 HashMap 的两个条目?
【问题讨论】:
-
entry()方法创建Entry{}的实例,其中包含键和值的引用。在封闭范围内对这两个实例进行内存交换可能不会产生任何效果。 -
@ÖmerErden 哦,你是对的。但
get根据文档返回引用。知道如何交换这些元素吗? -
你能说一下为什么要交换一个 hashmap 的两个值吗?算法是什么?我们很好奇。
-
@Stargateur 作为一个练习,我将之前用 python 制作的演示转换为 rust。该演示展示了如何使用模拟退火攻击替代密码。密码的关键是哈希图(替换表),我需要能够交换元素。