Vec::contains în Rust

Verifică dacă vectorul conține un element egal cu valoarea dată; parcurge elementele unul câte unul.

Sintaxă
pub fn contains(&self, x: &T) -> bool   // T: PartialEq

Ce face Vec::contains

contains(&x) returnează true dacă măcar un element este egal cu x. Primește o referință la valoare, nu valoarea. Căutarea parcurge vectorul de la început, deci durează proporțional cu lungimea.

Pentru un Vec<String>, contains cere un &String, nu un &str. Varianta comodă este v.iter().any(|s| s == "text"). Dacă faci multe căutări în aceeași colecție mare, un HashSet răspunde mult mai repede.

Parametri

Parametru Descriere
x Referință la valoarea căutată.

Ce returnează

true sau false. Pentru poziția elementului folosește iter().position().

Exemple

Exemplul 1: E pe lista de invitați?

fn main() {
    let invitati = vec!["Ana", "Mihai", "Ioana"];
    for nume in ["Mihai", "Radu"] {
        if invitati.contains(&nume) {
            println!("{nume} este pe listă");
        } else {
            println!("{nume} nu este invitat");
        }
    }
}

Rezultat

Mihai este pe listă
Radu nu este invitat

Exemplul 2: Vec de String și căutare cu &str

fn main() {
    let culori: Vec<String> = vec!["roșu".to_string(), "galben".to_string(), "albastru".to_string()];
    // contains cere &String; cu un &str e mai comod iter().any
    println!("{}", culori.contains(&"galben".to_string()));
    println!("{}", culori.iter().any(|c| c == "verde"));

    let note = vec![5, 8, 10];
    println!("are vreun 10? {}", note.contains(&10));
}

Rezultat

true
false
are vreun 10? true

Greșeli frecvente

  • Scrii v.contains(10) fără &: expected `&{integer}`, found integer.
  • Pentru Vec<String> scrii v.contains("Ana"): tipul nu se potrivește. Folosește v.iter().any(|s| s == "Ana").
  • Faci mii de contains pe un vector mare într-o buclă. Fiecare căutare parcurge tot vectorul; un HashSet are căutare aproape instantă.

Comenzi înrudite

  • Vec::binary_search: Caută rapid o valoare într-un vector sortat: Ok(poziție) dacă există, Err(poziție) unde ar trebui inserată.
  • 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.
  • Iterator::position: Returnează poziția (indexul de la 0) primului element care îndeplinește condiția, sau None.
  • HashSet::insert: insert adaugă o valoare (true dacă era nouă), contains verifică dacă există, remove o scoate (true dacă exista).
  • Vec::starts_with: Verifică dacă vectorul începe cu elementele date (în aceeași ordine); ends_with verifică sfârșitul.