Vec::split_at în Rust

Împarte vectorul în două slice-uri la o poziție, fără copiere: elementele dinainte și elementele de la poziție încolo.

Sintaxă
pub fn split_at(&self, mid: usize) -> (&[T], &[T])
pub fn split_at_mut(&mut self, mid: usize) -> (&mut [T], &mut [T])

Ce face Vec::split_at

split_at(mid) returnează un tuplu cu două slice-uri: [0..mid) și [mid..len). Nimic nu este copiat sau mutat; sunt doar două „ferestre” spre același vector. Un mid mai mare decât lungimea oprește programul; split_at_checked (Rust 1.80) returnează None în acest caz.

split_at_mut este modul în care obții două referințe mutabile spre părți diferite ale aceluiași vector. Regulile de împrumut nu permit &mut v[0] și &mut v[3] deodată, dar permit două jumătăți separate.

Parametri

Parametru Descriere
mid Poziția de tăiere, între 0 și len(). Elementul de pe ea ajunge în a doua parte.

Ce returnează

Un tuplu (stânga, dreapta) de slice-uri.

Exemple

Exemplul 1: Notele pe semestre

fn main() {
    let note = vec![9, 7, 10, 8, 6, 10];
    let (sem1, sem2) = note.split_at(3);
    println!("semestrul 1: {:?}, semestrul 2: {:?}", sem1, sem2);

    let (tot, nimic) = note.split_at(note.len());
    println!("{:?} | {:?}", tot, nimic);
    println!("split_at_checked(10): {:?}", note.split_at_checked(10));
}

Rezultat

semestrul 1: [9, 7, 10], semestrul 2: [8, 6, 10]
[9, 7, 10, 8, 6, 10] | []
split_at_checked(10): None

Exemplul 2: Două părți modificate în același timp

Adunăm fiecărui element din prima jumătate elementul corespunzător din a doua.

fn main() {
    let mut scoruri = vec![1, 2, 3, 40, 50, 60];
    let (stanga, dreapta) = scoruri.split_at_mut(3);
    for (a, b) in stanga.iter_mut().zip(dreapta.iter()) {
        *a += b;
    }
    println!("{:?}", scoruri);
}

Rezultat

[41, 52, 63, 40, 50, 60]

Greșeli frecvente

  • Încerci să iei două referințe mutabile cu indexare (let a = &mut v[0]; let b = &mut v[1];): cannot borrow `v` as mutable more than once at a time. Folosește split_at_mut sau v.swap(0, 1).
  • Folosești split_at cu o poziție venită din date: o valoare prea mare oprește programul. Verifică sau folosește split_at_checked.

Comenzi înrudite

  • 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::windows: windows dă ferestre suprapuse de câte n elemente consecutive; chunks împarte vectorul în bucăți separate de câte n.
  • 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ă.
  • Vec::starts_with: Verifică dacă vectorul începe cu elementele date (în aceeași ordine); ends_with verifică sfârșitul.