Ce face Iterator::is_sorted
is_sorted() compară elementele vecine și returnează false la prima pereche în care al doilea element este mai mic decât primul. Elementele egale alăturate sunt permise. Un iterator gol sau cu un singur element este sortat.
is_sorted_by_key(|x| cheie) verifică ordinea după o cheie, iar is_sorted_by(|a, b| a <= b) primește regula de comparație (de exemplu a >= b pentru ordine descrescătoare). Aceleași metode există și pe slice-uri: v.is_sorted(). Merge și pe f64, pentru că cere doar PartialOrd.
Ce returnează
bool.
Exemple
Exemplul 1: Crescător, descrescător, după cheie
fn main() {
println!("{}", [1, 3, 3, 7].iter().is_sorted());
println!("{}", [1, 7, 3].iter().is_sorted());
println!("{}", [12.5, 9.0, 3.25].iter().is_sorted_by(|a, b| a >= b));
let cuvinte = ["a", "doi", "patru", "cinci"];
println!("după lungime: {}", cuvinte.iter().is_sorted_by_key(|c| c.len()));
println!("pe slice: {}", vec![2, 4, 8].is_sorted());
}
Rezultat
true
false
true
după lungime: true
pe slice: true
Exemplul 2: Verificare înainte de căutarea binară
fn cauta(v: &[u32], x: u32) -> Result<usize, usize> {
debug_assert!(v.is_sorted(), "binary_search cere un vector sortat");
v.binary_search(&x)
}
fn main() {
let ani = [1859, 1918, 1989, 2007];
println!("{:?}", cauta(&ani, 1918));
println!("datele sunt sortate: {}", ani.is_sorted());
}
Rezultat
Ok(1)
datele sunt sortate: true
Greșeli frecvente
- Te aștepți ca
is_sortedsă verifice ordinea descrescătoare: verifică doar crescător. Pentru descrescător:is_sorted_by(|a, b| a >= b). - Sortezi doar ca să verifici dacă datele erau deja sortate:
is_sortednu modifică nimic și face o singură trecere.
Comenzi înrudite
Vec::sort: Sortează vectorul crescător, pe loc. sort este stabilă (păstrează ordinea elementelor egale); sort_unstable e mai rapidă.Vec::binary_search: Caută rapid o valoare într-un vector sortat: Ok(poziție) dacă există, Err(poziție) unde ar trebui inserată.Vec::windows: windows dă ferestre suprapuse de câte n elemente consecutive; chunks împarte vectorul în bucăți separate de câte n.Iterator::any: any verifică dacă măcar un element îndeplinește condiția; all verifică dacă toate o îndeplinesc. Se opresc cât de repede pot.