Vec::len în Rust

len returnează numărul de elemente din vector; is_empty spune dacă vectorul nu are niciun element.

Sintaxă
pub fn len(&self) -> usize
pub fn is_empty(&self) -> bool

Ce face Vec::len

len() returnează câte elemente are vectorul, ca usize (întreg fără semn, de mărimea unei adrese de memorie). Valoarea este ținută în vector, deci apelul este instant, oricât de mare ar fi vectorul.

is_empty() este echivalent cu len() == 0, dar se citește mai clar. Ultimul element valid este pe poziția len() - 1.

Pentru că rezultatul este usize, calculele cu el au nevoie de conversii: media se calculează cu suma as f64 / v.len() as f64. Atenție: v.len() - 1 pe un vector gol nu dă -1, ci oprește programul (depășire la scădere).

Ce returnează

len: numărul de elemente (usize). is_empty: true dacă nu există elemente.

Exemple

Exemplul 1: Numărul de elemente

fn main() {
    let note: Vec<u32> = vec![10, 9, 8];
    let absente: Vec<u32> = Vec::new();
    println!("note:    len = {}, is_empty = {}", note.len(), note.is_empty());
    println!("absente: len = {}, is_empty = {}", absente.len(), absente.is_empty());
}

Rezultat

note:    len = 3, is_empty = false
absente: len = 0, is_empty = true

Exemplul 2: Media, fără împărțire la zero

Verificăm întâi is_empty(). Funcția returnează Option, ca apelantul să știe că pentru o listă goală nu există medie.

fn media(note: &[u32]) -> Option<f64> {
    if note.is_empty() {
        return None;
    }
    let suma: u32 = note.iter().sum();
    Some(suma as f64 / note.len() as f64)
}

fn main() {
    println!("{:?}", media(&[9, 10, 7]));
    println!("{:?}", media(&[10, 9]));
    println!("{:?}", media(&[]));
}

Rezultat

Some(8.666666666666666)
Some(9.5)
None

Exemplul 3: Elemente, nu octeți

Pentru un String, len() numără octeții UTF-8 („ș” are 2 octeți). Un Vec<char> are câte un element pe literă.

fn main() {
    let oras = "Brașov";
    let litere: Vec<char> = oras.chars().collect();
    println!("{} octeți în text, {} elemente în Vec<char>", oras.len(), litere.len());
    println!("ultima literă: {}", litere[litere.len() - 1]);
}

Rezultat

7 octeți în text, 6 elemente în Vec<char>
ultima literă: v

Greșeli frecvente

  • Scrii v[v.len() - 1] pe un vector care poate fi gol. 0 - 1 pe usize oprește programul cu attempt to subtract with overflow. Folosește v.last(), care returnează Option.
  • Compari v.len() cu un i32: mismatched types. Convertește explicit (n as usize) sau declară variabila ca usize.
  • Confunzi len() cu capacity(): capacitatea este locul rezervat, nu numărul de elemente.

Comenzi înrudite

  • Vec: Vectorul dinamic din Rust: o listă de elemente de același tip, ținute unul după altul în memorie, care crește singură.
  • Vec::with_capacity: Creează un vector cu loc rezervat dinainte; capacity spune cât loc are, iar reserve mărește locul fără să adauge elemente.
  • Vec::first: first returnează primul element, last ultimul, ca Option: None dacă vectorul este gol.
  • Vec::get: Citește elementul de pe o poziție fără risc de panic: returnează Some(&element) sau None dacă poziția nu există.
  • HashMap::len: len spune câte perechi cheie-valoare are dicționarul, is_empty dacă nu are niciuna, iar clear le șterge pe toate.