Vec::to_vec în Rust

Creează un Vec nou, cu copii ale elementelor dintr-un slice: dintr-un tablou, dintr-o bucată de vector sau dintr-un &[T].

Sintaxă
pub fn to_vec(&self) -> Vec<T>   // T: Clone

Ce face Vec::to_vec

to_vec() clonează fiecare element al slice-ului într-un vector nou, pe care îl deții. Este modul obișnuit de a transforma un &[T] (primit ca parametru) într-un Vec<T> pe care îl poți modifica, sorta sau returna.

Pe un Vec întreg, v.to_vec() face același lucru ca v.clone(). Pe o bucată (v[..3].to_vec()) copiază doar acele elemente. Funcționează la fel și to_owned() sau Vec::from(slice).

Ce returnează

Un Vec<T> nou, independent de original.

Exemple

Exemplul 1: Copie modificabilă a unui tablou și a unei bucăți

fn main() {
    let tablou = [3, 1, 2];
    let mut copie = tablou.to_vec();
    copie.push(4);
    copie.sort();
    println!("tablou: {:?}, copie: {:?}", tablou, copie);

    let note = vec![10, 9, 8, 7, 6];
    let primele: Vec<i32> = note[..3].to_vec();
    println!("primele trei: {:?}", primele);
}

Rezultat

tablou: [3, 1, 2], copie: [1, 2, 3, 4]
primele trei: [10, 9, 8]

Exemplul 2: Funcție care primește &[T] și returnează un Vec nou

fn fara_duplicate(date: &[u32]) -> Vec<u32> {
    let mut v = date.to_vec();
    v.sort_unstable();
    v.dedup();
    v
}

fn main() {
    let voturi = [3, 1, 3, 2, 1, 3];
    println!("{:?}", fara_duplicate(&voturi));
    println!("originalul: {:?}", voturi);
}

Rezultat

[1, 2, 3]
originalul: [3, 1, 3, 2, 1, 3]

Greșeli frecvente

  • Folosești to_vec() doar ca să citești datele. Clonarea costă; dacă nu modifici și nu păstrezi copia, lucrează direct cu slice-ul.
  • Elemente fără Clone: to_vec nu compilează. Mută elementele în loc să le copiezi (de exemplu cu drain sau into_iter).

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::concat: concat lipește o listă de liste (sau de texte) într-una singură; join face la fel, cu un separator între ele.
  • Vec::split_off: Taie vectorul în două la o poziție: primele elemente rămân, restul sunt mutate într-un vector nou returnat.
  • Iterator::cloned: Transformă un iterator de referințe (&T) într-unul de valori (T): copied copiază tipuri simple, cloned clonează orice tip Clone.