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 curemoveș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.