Vec::insert în Rust

insert pune un element pe o poziție anume și împinge restul la dreapta; remove scoate elementul de pe o poziție.

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

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ște VecDeque::pop_front sau parcurge vectorul cu drain(..).
  • 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ște retain pentru a păstra doar elementele dorite.
  • Te aștepți ca remove să returneze Option, ca pop. Nu: returnează direct elementul și dă panic la poziție invalidă. Verifică întâi i < 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.