Iterator::min în Rust

Returnează cel mai mic (min) sau cel mai mare (max) element, ca Option: None pentru un iterator gol.

Sintaxă
fn min(self) -> Option<Self::Item>   // Self::Item: Ord
fn max(self) -> Option<Self::Item>

Ce face Iterator::min

min() și max() compară elementele cu ordinea lor naturală (Ord) și returnează Some(extrem), sau None dacă iteratorul e gol. Pe v.iter() primești o referință (Option<&T>); adaugă .copied() pentru valoare.

Dacă mai multe elemente sunt egale cu extremul, max îl returnează pe ultimul, iar min pe primul. f64 nu implementează Ord, deci min()/max() nu compilează pentru el; folosește reduce(f64::max), fold sau max_by(|a, b| a.total_cmp(b)). Pentru extremul după un criteriu (cel mai ieftin produs), vezi min_by_key.

Ce returnează

Option<Self::Item>.

Exemple

Exemplul 1: Note, texte, iterator gol

Textele se compară după octeți: „Zalău” e mai mare decât „Arad”, iar „Ștei” e mai mare decât amândouă.

fn main() {
    let note = [8, 10, 6, 9];
    println!("min {:?}, max {:?}", note.iter().min(), note.iter().max());

    let orase = ["Iași", "Arad", "Zalău", "Ștei"];
    println!("{:?} {:?}", orase.iter().min(), orase.iter().max());

    let goale: Vec<u32> = Vec::new();
    println!("{:?}", goale.iter().max());
    println!("cu valoare implicită: {}", goale.iter().max().copied().unwrap_or(0));
}

Rezultat

min Some(6), max Some(10)
Some("Arad") Some("Ștei")
None
cu valoare implicită: 0

Exemplul 2: Maximul unor f64

temperaturi.iter().max() nu compilează (the trait bound `f64: Ord` is not satisfied). max_by cu total_cmp rezolvă.

fn main() {
    let temperaturi: [f64; 4] = [12.5, 18.25, -3.0, 7.5];
    let max = temperaturi.iter().copied().max_by(|a, b| a.total_cmp(b));
    let min = temperaturi.iter().copied().min_by(|a, b| a.total_cmp(b));
    println!("între {:?} și {:?}", min, max);
}

Rezultat

între Some(-3.0) și Some(18.25)

Greșeli frecvente

  • Apelezi max() pe f64: nu compilează. Folosește max_by(|a, b| a.total_cmp(b)).
  • Folosești .unwrap() pe rezultat fără să te gândești la lista goală: programul se oprește.
  • Sortezi tot vectorul doar ca să afli minimul. min() parcurge o singură dată.

Comenzi înrudite

  • Iterator::min_by_key: Găsește elementul minim sau maxim după un criteriu: o cheie calculată (by_key) sau o funcție de comparare (by).
  • Iterator::reduce: Combină elementele două câte două, folosind primul element ca valoare inițială; returnează None pentru un iterator gol.
  • Iterator::fold: Combină toate elementele într-o singură valoare, pornind de la o valoare inițială și aplicând o funcție pas cu pas.
  • Vec::sort: Sortează vectorul crescător, pe loc. sort este stabilă (păstrează ordinea elementelor egale); sort_unstable e mai rapidă.