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()pef64: nu compilează. Foloseștemax_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ă.