Rust 编程中的 HashSet


Rust 也为我们提供了 HashSet 数据结构,当我们希望确保我们的数据结构中没有重复的值时,主要会使用该结构。

如果我们尝试将一个新值插入到一个 HashSet 中,而该值已经存在,那么我们插入的旧值会被新值覆盖

除了这些主要特性以外,HashSet 还用于执行以下操作 −

  • 并集 − 提取两个集合中的所有唯一元素。
  • 差集 − 获取第 1 个集合中但第 2 个集合中没有的所有元素。
  • 交集 − 获取两个集合中都存在的的所有元素。
  • 对称差 − 获取在一个集合中或另一个集合中,但不在两个集合中同时存在的所有元素。

例如

考虑如下所示的示例 −

use std::collections::HashSet;

fn main() {
   let mut a: HashSet = vec![1i32, 2, 3].into_iter().collect();
   let mut b: HashSet = vec![2i32, 3, 4].into_iter().collect();
   assert!(a.insert(4));
   assert!(a.contains(&4));
   // `HashSet::insert()` returns false if value already present  
   assert!(b.insert(4), "Value 4 is already in set B!");
   b.insert(5);
}

在这个示例中,我们创建了一个 HashSet,并向其中插入了值。如果尝试插入已存在的值,则 insert() 函数将返回一个 false。因此,上面的代码将返回一个错误。

输出

thread 'main' panicked at 'Value 4 is already in set B!',
src/main.rs:11:5
note: run with `RUST_BACKTRACE=1` environment variable to display
a backtrace

例如

现在,让我们尝试使用 HashSet 中提供的所有方法。考虑以下示例 −

use std::collections::HashSet;
fn main() {
   let mut a: HashSet = vec![1i32, 2, 3].into_iter().collect();
   let mut b: HashSet = vec![2i32, 3, 4].into_iter().collect();
   assert!(a.insert(4));
   assert!(a.contains(&4));
   b.insert(6);
   println!("A: {:?}", a);
   println!("B: {:?}", b);
   println!("Union: {:?}", a.union(&b).collect::>());
   println!("Difference: {:?}",
   a.difference(&b).collect::>());
   println!("Intersection: {:?}",
   a.intersection(&b).collect::>());
   println!("Symmetric Difference: {:?}",
   a.symmetric_difference(&b).collect::>());
}

输出

A: {1, 2, 3, 4}
B: {4, 6, 2, 3}
Union: [1, 2, 3, 4, 6]
Difference: [1]
Intersection: [2, 3, 4]
Symmetric Difference: [1, 6]

最后更新日期: 03-4 月-2021

405 次浏览

启动你的 事业

完成课程获得认证

开始
广告