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]
广告