Ce face Iterator::position
position(|x| cond) numără elementele de la 0 și returnează Some(i) pentru primul care îndeplinește condiția. Se oprește acolo. Closure-ul primește elementul prin valoare (pe v.iter(), deci, &T).
rposition caută de la coadă și returnează indexul ultimului element potrivit (pentru iteratori cu lungime cunoscută, ca ai vectorilor). Pentru a căuta o valoare exactă într-un vector sortat, binary_search este mai rapid.
Parametri
| Parametru | Descriere |
|---|---|
predicate |
Condiția căutată. |
Ce returnează
Option<usize>.
Exemple
Exemplul 1: Unde e primul și ultimul
fn main() {
let coada = ["Ana", "Mihai", "Ioana", "Mihai", "Radu"];
println!("{:?}", coada.iter().position(|&n| n == "Mihai"));
println!("{:?}", coada.iter().rposition(|&n| n == "Mihai"));
println!("{:?}", coada.iter().position(|&n| n == "Elena"));
}
Rezultat
Some(1)
Some(3)
None
Exemplul 2: Scoaterea unui element după valoare
Vec nu are „șterge valoarea x”; găsim poziția și folosim remove.
fn main() {
let mut cos = vec!["pâine", "lapte", "ouă", "lapte"];
if let Some(i) = cos.iter().position(|&p| p == "lapte") {
cos.remove(i);
}
println!("{:?}", cos);
}
Rezultat
["pâine", "ouă", "lapte"]
Greșeli frecvente
- Folosești poziția găsită după ce ai modificat vectorul: indicii s-au schimbat.
- Pui
positiondupă unfiltersauskipși o folosești ca index în vectorul original: numără elementele care ajung la ea, nu pozițiile originale.
Comenzi înrudite
Iterator::find: Returnează primul element care îndeplinește condiția, în Some, sau None dacă niciunul nu o îndeplinește.Iterator::enumerate: Adaugă fiecărui element poziția lui: produce perechi (index, element), cu indexul pornind de la 0.Vec::binary_search: Caută rapid o valoare într-un vector sortat: Ok(poziție) dacă există, Err(poziție) unde ar trebui inserată.Vec::contains: Verifică dacă vectorul conține un element egal cu valoarea dată; parcurge elementele unul câte unul.