HashSet::iter în Rust

Parcurge elementele mulțimii prin referință, într-o ordine aleatorie; pentru afișare stabilă, colectează și sortează.

Sintaxă
pub fn iter(&self) -> Iter<'_, T>   // produce &T

Ce face HashSet::iter

iter() (sau for x in &s) dă câte o referință la fiecare element. Ordinea depinde de valorile de dispersie și se schimbă la fiecare rulare a programului.

Operațiile care nu depind de ordine (count, sum, any, filter + count, max) dau mereu același rezultat. Pentru afișare sau pentru teste, colectează într-un Vec și sortează. Elementele unui HashSet nu pot fi modificate pe loc (nu există iter_mut), pentru că s-ar strica dispersia; scoate elementul și pune-l pe cel nou.

Ce returnează

Un iterator Iter de &T.

Exemple

Exemplul 1: Calcule care nu depind de ordine

use std::collections::HashSet;

fn main() {
    let etichete: HashSet<&str> = HashSet::from(["rust", "linux", "web", "baze-de-date", "ai"]);
    let lungi = etichete.iter().filter(|e| e.len() > 3).count();
    let cea_mai_lunga = etichete.iter().max_by_key(|e| e.len());
    println!("{} etichete, {} mai lungi de 3 litere", etichete.len(), lungi);
    println!("cea mai lungă: {:?}", cea_mai_lunga);

    let mut sortate: Vec<&&str> = etichete.iter().collect();
    sortate.sort();
    println!("sortate: {:?}", sortate);
}

Rezultat

5 etichete, 3 mai lungi de 3 litere
cea mai lungă: Some("baze-de-date")
sortate: ["ai", "baze-de-date", "linux", "rust", "web"]

Exemplul 2: Parcurgere directă: ordinea se schimbă

use std::collections::HashSet;

fn main() {
    let culori = HashSet::from(["roșu", "galben", "albastru", "verde"]);
    for c in &culori {
        println!("{c}");
    }
}

Rezultat posibil (ordinea diferă la fiecare rulare)

galben
albastru
verde
roșu

Greșeli frecvente

  • Te bazezi pe ordinea de parcurgere: rezultatul se schimbă de la o rulare la alta.
  • Cauți iter_mut: nu există pentru mulțimi. Scoate elementul vechi cu remove și inserează-l pe cel nou.

Comenzi înrudite

  • HashSet: O mulțime: ține fiecare valoare o singură dată și răspunde foarte repede dacă o valoare există. Ordinea nu e garantată.
  • HashMap::iter: Parcurge perechile din dicționar: iter dă (&cheie, &valoare), iter_mut dă (&cheie, &mut valoare). Ordinea e aleatorie.
  • BTreeSet: Mulțime cu elementele mereu sortate: fără duplicate, ca HashSet, dar parcurgerea este în ordine crescătoare.
  • Vec::iter: Cele trei moduri de a parcurge un vector: iter dă referințe, iter_mut dă referințe mutabile, into_iter dă elementele.