Rust学习笔记_15------Union
Rust学习笔记_16------Vector
Rust学习笔记_17------HashMap
HashSet
文章目录
-
- HashSet
-
- [1. 创建](#1. 创建)
- [2. 插入](#2. 插入)
- [3. 检查元素是否存在](#3. 检查元素是否存在)
- [4. 遍历](#4. 遍历)
- [5. 移除](#5. 移除)
- [6. 工作原理](#6. 工作原理)
- [7. 示例](#7. 示例)
Rust 中的 HashSet
是一种集合数据结构,它允许你存储不重复的元素,并且可以在常数时间内(O(1) 平均时间复杂度)检查一个元素是否存在于集合中。
HashSet
也是 Rust 标准库的一部分,位于 std::collections
模块中。
1. 创建
rust
// 引入HashSet类型
use std::collections::HashSet;
// 创建HashSet实例
let mut set: HashSet<i32> = HashSet::new();
2. 插入
使用 insert
方法可以向 HashSet
中插入元素。
由于 HashSet
不允许重复元素,如果尝试插入一个已经存在的元素,insert
方法将返回 false
,否则返回 true
。
rust
set.insert(1);
set.insert(2);
set.insert(2); // 这将返回 false,因为 2 已经存在于集合中
3. 检查元素是否存在
使用 contains
方法可以检查一个元素是否存在于 HashSet
中。该方法返回一个布尔值。
rust
let exists = set.contains(&1); // 这将返回 true
4. 遍历
使用迭代器来遍历 HashSet
中的元素。
由于 HashSet
不保证元素的存储顺序,因此遍历的顺序是不确定的。
rust
for elem in &set {
println!("{}", elem);
}
5. 移除
使用 remove
方法可以从 HashSet
中移除一个元素。
如果元素存在并被成功移除,该方法将返回 true
,否则返回 false
。
rust
set.remove(&1); // 这将返回 true,并从集合中移除元素 1
6. 工作原理
HashSet
是基于哈希表实现的。
当你向 HashSet
中插入一个元素时,它的哈希值被计算出来,并用来确定元素在内部数组(也称为"桶"或"槽")中的位置。
如果两个元素的哈希值相同(即发生了哈希冲突),它们将被存储在同一个桶中,并通过链地址法(也称为"拉链法")或开放地址法来解决冲突。
在 Rust 的 HashSet
实现中,默认使用了 SipHash
作为哈希函数,这是因为它提供了良好的哈希分布和防御哈希洪水攻击的能力。
7. 示例
rust
use std::collections::HashSet;
fn main() {
let mut set: HashSet<i32> = HashSet::new();
// 插入元素
set.insert(1);
set.insert(2);
set.insert(2); // 这将不会改变集合,因为 2 已经存在
// 检查元素是否存在
if set.contains(&1) {
println!("1 is in the set");
}
// 移除元素
set.remove(&1);
if !set.contains(&1) {
println!("1 is not in the set anymore");
}
// 遍历
for elem in &set {
println!("{}", elem);
}
}