当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Rust HashSet用法及代码示例


本文简要介绍rust语言中 Struct std::collections::HashSet 的用法。

用法

pub struct HashSet<T, S = RandomState> { /* fields omitted */ }

hash set 实现为 HashMap,其中值为 ()

HashMap 类型一样,HashSet 要求元素实现 Eq Hash 特征。这通常可以通过使用 #[derive(PartialEq, Eq, Hash)] 来实现。如果您自己实现这些,重要的是要满足以下属性:

k1 == k2 -> hash(k1) == hash(k2)

换句话说,如果两个键相等,则它们的哈希值必须相等。

以这样一种方式修改项目是一个逻辑错误,即项目的哈希(由 Hash 特征确定)或其相等性(由 Eq 特征确定)在它位于集合中时发生变化。这通常只能通过 Cell RefCell 、全局状态、I/O 或不安全代码实现。未指定由此类逻辑错误导致的行为(它可能包括Panics、不正确的结果、中止、内存泄漏或未终止),但不会是未定义的行为。

例子

use std::collections::HashSet;
// Type inference lets us omit an explicit type signature (which
// would be `HashSet<String>` in this example).
let mut books = HashSet::new();

// Add some books.
books.insert("A Dance With Dragons".to_string());
books.insert("To Kill a Mockingbird".to_string());
books.insert("The Odyssey".to_string());
books.insert("The Great Gatsby".to_string());

// Check for a specific one.
if !books.contains("The Winds of Winter") {
    println!("We have {} books, but The Winds of Winter ain't one.",
             books.len());
}

// Remove a book.
books.remove("The Odyssey");

// Iterate over everything.
for book in &books {
    println!("{}", book);
}

HashSet 与自定义类型一起使用的最简单方法是派生 Eq Hash 。我们还必须派生 PartialEq ,这将在未来被 Eq 暗示。

use std::collections::HashSet;
#[derive(Hash, Eq, PartialEq, Debug)]
struct Viking {
    name: String,
    power: usize,
}

let mut vikings = HashSet::new();

vikings.insert(Viking { name: "Einar".to_string(), power: 9 });
vikings.insert(Viking { name: "Einar".to_string(), power: 9 });
vikings.insert(Viking { name: "Olaf".to_string(), power: 4 });
vikings.insert(Viking { name: "Harald".to_string(), power: 8 });

// Use derived implementation to print the vikings.
for x in &vikings {
    println!("{:?}", x);
}

可以从数组初始化具有已知项目列表的HashSet

use std::collections::HashSet;

let viking_names = HashSet::from(["Einar", "Olaf", "Harald"]);

相关用法


注:本文由纯净天空筛选整理自rust-lang.org大神的英文原创作品 Struct std::collections::HashSet。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。