Vec::truncate în Rust

truncate păstrează doar primele len elemente; clear golește vectorul. Ambele lasă capacitatea neschimbată.

Sintaxă
pub fn truncate(&mut self, len: usize)
pub fn clear(&mut self)

Ce face Vec::truncate

truncate(n) scurtează vectorul la primele n elemente; restul sunt eliberate (pentru String-uri, memoria lor este eliberată imediat). Dacă n este mai mare sau egal cu lungimea, nu se întâmplă nimic: nu dă eroare și nu adaugă elemente.

clear() scoate toate elementele; este același lucru cu truncate(0). Vectorul rămâne utilizabil.

Niciuna nu eliberează memoria rezervată: capacitatea rămâne aceeași. Asta e util când refolosești același vector într-o buclă: după clear(), următoarele push nu mai alocă memorie. Dacă vrei memoria înapoi, apelează după aceea shrink_to_fit().

Parametri

Parametru Descriere
len Câte elemente să rămână (de la început).

Ce returnează

Nimic. Elementele scoase nu sunt returnate; pentru a le primi folosește drain sau split_off.

Exemple

Exemplul 1: Podiumul unui clasament

fn main() {
    let mut clasament = vec!["Ana", "Mihai", "Ioana", "Radu", "Elena"];
    clasament.truncate(3);
    println!("podium: {:?}", clasament);

    clasament.truncate(10); // mai mare decât lungimea: nu face nimic
    println!("după truncate(10): {:?}", clasament);

    let cap = clasament.capacity();
    clasament.clear();
    println!("după clear: {:?}, len = {}, capacity = {} (era {cap})", clasament, clasament.len(), clasament.capacity());
}

Rezultat

podium: ["Ana", "Mihai", "Ioana"]
după truncate(10): ["Ana", "Mihai", "Ioana"]
după clear: [], len = 0, capacity = 5 (era 5)

Exemplul 2: Același vector refolosit într-o buclă

clear() golește vectorul la fiecare propoziție, dar păstrează memoria alocată pentru următoarea.

fn main() {
    let propozitii = ["Ana are mere", "Ion merge la Iași", "Azi plouă"];
    let mut cuvinte_lungi = Vec::new();
    for p in propozitii {
        cuvinte_lungi.clear();
        for c in p.split_whitespace() {
            if c.chars().count() > 3 {
                cuvinte_lungi.push(c);
            }
        }
        println!("{p:20} -> {:?}", cuvinte_lungi);
    }
}

Rezultat

Ana are mere         -> ["mere"]
Ion merge la Iași    -> ["merge", "Iași"]
Azi plouă            -> ["plouă"]

Greșeli frecvente

  • Te aștepți ca truncate(10) să mărească vectorul la 10 elemente. truncate doar micșorează; pentru a mări folosește resize.
  • Crezi că clear() eliberează memoria. Capacitatea rămâne; dacă vectorul a fost uriaș și nu-l mai umpli, apelează shrink_to_fit() sau lasă-l să iasă din domeniu.

Comenzi înrudite

  • Vec::drain: Scoate din vector elementele dintr-un interval de poziții și le dă înapoi ca iterator, mutate (fără copiere).
  • Vec::split_off: Taie vectorul în două la o poziție: primele elemente rămân, restul sunt mutate într-un vector nou returnat.
  • Vec::resize: Schimbă lungimea vectorului: îl taie dacă e prea lung sau adaugă copii ale unei valori până la noua lungime.
  • 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::len: len returnează numărul de elemente din vector; is_empty spune dacă vectorul nu are niciun element.