Vec::resize în Rust

Schimbă lungimea vectorului: îl taie dacă e prea lung sau adaugă copii ale unei valori până la noua lungime.

Sintaxă
pub fn resize(&mut self, new_len: usize, value: T)   // T: Clone

Ce face Vec::resize

resize(n, valoare) aduce vectorul la exact n elemente. Dacă vectorul este mai lung, se comportă ca truncate(n). Dacă este mai scurt, adaugă la final copii ale lui valoare până la lungimea n.

Valoarea trebuie să implementeze Clone, pentru că este copiată pentru fiecare poziție nouă. Pentru valori care se calculează (sau pentru tipuri fără Clone), există resize_with(n, || ...), care apelează un closure pentru fiecare element nou.

Parametri

Parametru Descriere
new_len Lungimea finală dorită.
value Valoarea copiată în pozițiile noi (ignorată dacă vectorul se micșorează).

Ce returnează

Nimic; vectorul este modificat.

Exemple

Exemplul 1: Mărire și micșorare

fn main() {
    let mut locuri = vec!["ocupat"; 3];
    locuri.resize(5, "liber");
    println!("{:?}", locuri);

    locuri.resize(2, "nefolosit");
    println!("{:?}", locuri);
}

Rezultat

["ocupat", "ocupat", "ocupat", "liber", "liber"]
["ocupat", "ocupat"]

Exemplul 2: resize cu vectori și resize_with

Fiecare vector nou adăugat de resize este o copie independentă. resize_with apelează closure-ul pentru fiecare poziție nouă.

fn main() {
    let mut note_pe_luni: Vec<Vec<u32>> = Vec::new();
    note_pe_luni.resize(3, Vec::new());
    note_pe_luni[0].push(9);
    note_pe_luni[2].push(10);
    println!("{:?}", note_pe_luni);

    let mut id = 100;
    let mut coduri = vec![1, 2];
    coduri.resize_with(5, || {
        id += 1;
        id
    });
    println!("{:?}", coduri);
}

Rezultat

[[9], [], [10]]
[1, 2, 101, 102, 103]

Greșeli frecvente

  • Folosești resize ca să rezervi memorie. resize chiar adaugă elemente (lungimea crește). Pentru loc rezervat fără elemente folosește reserve.
  • Încerci resize cu un tip care nu are Clone: the trait bound `T: Clone` is not satisfied. Folosește resize_with.

Comenzi înrudite

  • Vec::truncate: truncate păstrează doar primele len elemente; clear golește vectorul. Ambele lasă capacitatea neschimbată.
  • Vec::fill: Scrie aceeași valoare în toate pozițiile vectorului (sau ale unei bucăți din el), fără să schimbe lungimea.
  • 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: Vectorul dinamic din Rust: o listă de elemente de același tip, ținute unul după altul în memorie, care crește singură.