Vec::split_off în Rust

Taie vectorul în două la o poziție: primele elemente rămân, restul sunt mutate într-un vector nou returnat.

Sintaxă
pub fn split_off(&mut self, at: usize) -> Vec<T>

Ce face Vec::split_off

split_off(at) scoate elementele de pe pozițiile at..len() și le pune într-un vector nou, pe care îl returnează. Vectorul original păstrează primele at elemente.

Elementele sunt mutate, nu copiate. split_off(0) mută tot conținutul în vectorul nou, iar split_off(len()) returnează un vector gol. O poziție mai mare decât lungimea oprește programul cu panic.

Dacă vrei doar să privești cele două jumătăți, fără să le muți în vectori separați, folosește split_at, care returnează două slice-uri.

Parametri

Parametru Descriere
at Poziția de tăiere, între 0 și len(). Elementul de pe această poziție ajunge în vectorul nou.

Ce returnează

Un Vec<T> nou cu elementele de la at până la final.

Exemple

Exemplul 1: Împărțirea clasei în două grupe

fn main() {
    let mut elevi = vec!["Ana", "Bogdan", "Cristina", "Dan", "Elena", "Florin"];
    let grupa2 = elevi.split_off(3);
    println!("grupa 1: {:?}", elevi);
    println!("grupa 2: {:?}", grupa2);
}

Rezultat

grupa 1: ["Ana", "Bogdan", "Cristina"]
grupa 2: ["Dan", "Elena", "Florin"]

Exemplul 2: Cazurile de la capete

fn main() {
    let mut v = vec![1, 2, 3];
    let tot = v.split_off(0);
    println!("split_off(0):   v = {:?}, nou = {:?}", v, tot);

    let mut w = vec![1, 2, 3];
    let nimic = w.split_off(3);
    println!("split_off(len): w = {:?}, nou = {:?}", w, nimic);
}

Rezultat

split_off(0):   v = [], nou = [1, 2, 3]
split_off(len): w = [1, 2, 3], nou = []

Greșeli frecvente

  • Crezi că elementul de pe poziția at rămâne în vectorul original. El ajunge primul în vectorul nou.
  • Folosești split_off doar ca să citești cele două părți. split_at nu mută nimic și nu alocă un vector nou.

Comenzi înrudite

  • Vec::split_at: Împarte vectorul în două slice-uri la o poziție, fără copiere: elementele dinainte și elementele de la poziție încolo.
  • Vec::truncate: truncate păstrează doar primele len elemente; clear golește vectorul. Ambele lasă capacitatea neschimbată.
  • Vec::drain: Scoate din vector elementele dintr-un interval de poziții și le dă înapoi ca iterator, mutate (fără copiere).
  • Vec::extend_from_slice: extend_from_slice adaugă copii ale elementelor dintr-un slice; append mută toate elementele altui vector și îl golește.