當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。