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_removepe un vector sortat sau într-o listă unde ordinea contează (clasament, istoric). Ordinea se strică; foloseșteremovesauretain. - Î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).