Rust 中如何检查两个 HashMap 是否相同?

ynn*_*ynn 5 hashmap language-lawyer rust

我有两个HashMap游乐场):

let mut m1: HashMap<u8, usize, _> = HashMap::new();
m1.insert(1, 100);
m1.insert(2, 200);

let mut m2: HashMap<u8, usize, _> = HashMap::new();
m2.insert(2, 200);
m2.insert(1, 100);
Run Code Online (Sandbox Code Playgroud)

如何检查两个地图m1m2是否相同?

我所说的“相同”是指满足以下所有条件

  • 按键类型相同。

  • 值的类型相同。

  • 两张地图具有完全相同的密钥集。插入顺序无关紧要。

  • m1.get(k) == m2.get(k)两个映射的每个键(即每个现有的键)具有完全相同的值k

据我测试,确实m1 == m2有效。然而,这种行为有保证吗?我想要某种保证(因此我添加了#language-lawyer标签)。

我已经阅读了HashMap 的官方文档

另外,HashSet和呢Vec?(我也阅读了他们的文档。)

Bam*_*tan 3

PartialEq查看 std 库的源代码,您可以找到这些不同集合的实现:

  • HashMap迭代所有键/​​值对并检查另一个映射是否具有该键的对应条目,然后检查这些值是否相等:source
  • HashSet迭代键并检查另一组是否包含该键:source
  • Vec实际上调用eq底层切片,它要么迭代每个值并比较它们:source,要么如果类型允许,则通过调用memcmpsource进行按位比较。

我不知道是否有任何形式的保证这种行为永远不会改变,但由于稳定,广泛使用 API,我看不到它们改变,永远。