Ce face Vec::insert
insert(i, x) pune x pe poziția i, iar elementele de la i încolo se mută cu o poziție la dreapta. Poziția poate fi și len(): atunci elementul ajunge la final, ca la push.
remove(i) scoate elementul de pe poziția i, îl returnează și mută la stânga elementele de după, ca să nu rămână gol. Ordinea elementelor se păstrează.
Ambele operații mută toate elementele de după poziție, deci pe vectori mari, la început, sunt lente (timp proporțional cu lungimea). Dacă ordinea nu contează, swap_remove scoate un element instant. Dacă inserezi des la început, alege VecDeque. O poziție invalidă (mai mare decât lungimea la insert, cel puțin lungimea la remove) oprește programul cu panic.
Parametri
| Parametru | Descriere |
|---|---|
index |
Poziția (de la 0). La insert: între 0 și len() inclusiv. La remove: între 0 și len() - 1. |
element |
Valoarea de inserat. |
Ce returnează
insert nu returnează nimic. remove returnează elementul scos (nu Option: dacă poziția nu există, programul se oprește).
Exemple
Exemplul 1: Inserare la început, la mijloc și la final
fn main() {
let mut coada = vec!["Ana", "Bogdan", "Cristina"];
coada.insert(0, "Dan"); // la început
coada.insert(2, "Elena"); // înainte de elementul de pe poziția 2
coada.insert(coada.len(), "Florin"); // la final, ca push
println!("{:?}", coada);
let scos = coada.remove(1);
println!("remove(1) = {scos}, rămân {:?}", coada);
}
Rezultat
["Dan", "Ana", "Elena", "Bogdan", "Cristina", "Florin"]
remove(1) = Ana, rămân ["Dan", "Elena", "Bogdan", "Cristina", "Florin"]
Exemplul 2: Inserare care păstrează vectorul sortat
binary_search spune unde ar trebui să stea valoarea: Ok(poz) dacă există deja, Err(poz) dacă nu. În ambele cazuri, poz este un loc bun pentru insert.
fn main() {
let mut note = vec![5, 7, 8, 10];
for noua in [9, 4, 7] {
let poz = note.binary_search(&noua).unwrap_or_else(|p| p);
note.insert(poz, noua);
println!("inserez {noua} pe poziția {poz}: {:?}", note);
}
}
Rezultat
inserez 9 pe poziția 3: [5, 7, 8, 9, 10]
inserez 4 pe poziția 0: [4, 5, 7, 8, 9, 10]
inserez 7 pe poziția 2: [4, 5, 7, 7, 8, 9, 10]
Exemplul 3: remove pe o poziție care nu există
Vectorul are 3 elemente (pozițiile 0, 1, 2), deci remove(5) oprește programul cu codul de ieșire 101. Mesajul spune poziția cerută și lungimea; numărul din paranteză este identificatorul firului de execuție și diferă la fiecare rulare.
fn main() {
let mut v = vec!["a", "b", "c"];
let x = v.remove(5);
println!("{x}");
}
Rezultat (programul se oprește cu panic)
thread 'main' (14500855) panicked at main.rs:3:15:
removal index (is 5) should be < len (is 3)
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
Greșeli frecvente
- Folosești
remove(0)în buclă ca să golești o coadă mare. Fiecare apel mută tot restul vectorului. FoloseșteVecDeque::pop_frontsau parcurge vectorul cudrain(..). - Scoți elemente cu
remove(i)într-o buclăfor i in 0..v.len(). După prima ștergere, indicii se decalează și ajungi la o poziție care nu mai există. Foloseșteretainpentru a păstra doar elementele dorite. - Te aștepți ca
removesă returnezeOption, capop. Nu: returnează direct elementul și dăpanicla poziție invalidă. Verifică întâii < v.len().
Comenzi înrudite
Vec::swap_remove: Scoate elementul de pe o poziție și pune în locul lui ultimul element; este instantaneu, dar schimbă ordinea.Vec::push: push adaugă un element la sfârșitul vectorului; pop îl scoate pe ultimul și îl returnează ca Option.Vec::retain: Păstrează în vector doar elementele pentru care funcția dată returnează true; restul sunt șterse, în aceeași ordine.Vec::binary_search: Caută rapid o valoare într-un vector sortat: Ok(poziție) dacă există, Err(poziție) unde ar trebui inserată.VecDeque::push_back: Adaugă (push) și scoate (pop) elemente la oricare capăt al cozii: back este sfârșitul, front este începutul.