Vec::swap_remove în Rust

Scoate elementul de pe o poziție și pune în locul lui ultimul element; este instantaneu, dar schimbă ordinea.

Sintaxă
pub fn swap_remove(&mut self, index: usize) -> T

Ce face Vec::swap_remove

swap_remove(i) scoate elementul de pe poziția i și îl returnează, ca remove. Diferența: golul rămas este umplut cu ultimul element al vectorului, nu prin mutarea tuturor elementelor la stânga.

Așa, ștergerea durează la fel de puțin indiferent de lungimea vectorului. În schimb, ordinea elementelor se schimbă. Folosește-l când vectorul este doar o „grămadă” de elemente (obiecte dintr-un joc, sarcini de procesat), unde ordinea nu contează.

Ca la remove, o poziție invalidă (cel puțin len()) oprește programul cu panic.

Parametri

Parametru Descriere
index Poziția elementului de scos, între 0 și len() - 1.

Ce returnează

Elementul scos.

Exemple

Exemplul 1: remove față de swap_remove

Ambele scot „Bogdan”. remove păstrează ordinea; swap_remove mută „Elena” (ultima) pe locul rămas liber.

fn main() {
    let mut a = vec!["Ana", "Bogdan", "Cristina", "Dan", "Elena"];
    let mut b = a.clone();

    let x = a.remove(1);
    let y = b.swap_remove(1);
    println!("remove(1)      -> {x}, {:?}", a);
    println!("swap_remove(1) -> {y}, {:?}", b);
}

Rezultat

remove(1)      -> Bogdan, ["Ana", "Cristina", "Dan", "Elena"]
swap_remove(1) -> Bogdan, ["Ana", "Elena", "Cristina", "Dan"]

Exemplul 2: Ștergere rapidă într-o buclă

Când scoatem un element, pe poziția i ajunge ultimul element, care încă nu a fost verificat. De aceea mărim i doar când păstrăm elementul.

fn main() {
    let mut comenzi = vec![120, 35, 400, 15, 80, 250];
    // scoatem comenzile sub 50 de lei; ordinea nu contează
    let mut i = 0;
    while i < comenzi.len() {
        if comenzi[i] < 50 {
            let scoasa = comenzi.swap_remove(i);
            println!("scot comanda de {scoasa} lei");
        } else {
            i += 1;
        }
    }
    println!("rămân: {:?}", comenzi);
}

Rezultat

scot comanda de 35 lei
scot comanda de 15 lei
rămân: [120, 250, 400, 80]

Greșeli frecvente

  • Folosești swap_remove pe un vector sortat sau într-o listă unde ordinea contează (clasament, istoric). Ordinea se strică; folosește remove sau retain.
  • Într-o buclă care șterge cu swap_remove, mărești indicele și după ștergere. Sari peste elementul mutat pe poziția curentă.

Comenzi înrudite

  • Vec::insert: insert pune un element pe o poziție anume și împinge restul la dreapta; remove scoate elementul de pe o poziție.
  • Vec::retain: Păstrează în vector doar elementele pentru care funcția dată returnează true; restul sunt șterse, în aceeași ordine.
  • Vec::push: push adaugă un element la sfârșitul vectorului; pop îl scoate pe ultimul și îl returnează ca Option.
  • Vec::drain: Scoate din vector elementele dintr-un interval de poziții și le dă înapoi ca iterator, mutate (fără copiere).