Iterator::position în Rust

Returnează poziția (indexul de la 0) primului element care îndeplinește condiția, sau None.

Sintaxă
fn position<P>(&mut self, predicate: P) -> Option<usize>
where P: FnMut(Self::Item) -> bool

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 position după un filter sau skip ș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.