VecDeque::push_back în Rust

Adaugă (push) și scoate (pop) elemente la oricare capăt al cozii: back este sfârșitul, front este începutul.

Sintaxă
pub fn push_back(&mut self, value: T)
pub fn push_front(&mut self, value: T)
pub fn pop_back(&mut self) -> Option<T>
pub fn pop_front(&mut self) -> Option<T>

Ce face VecDeque::push_back

push_back adaugă la sfârșit, push_front la început. pop_back și pop_front scot elementul de la capătul respectiv și îl returnează în Some; dacă coada este goală, returnează None.

Combinația push_back + pop_front dă o coadă obișnuită (FIFO). push_back + pop_back dă o stivă, ca la Vec. Toate patru operațiile sunt rapide, indiferent de lungime.

Parametri

Parametru Descriere
value Elementul adăugat (la push_back / push_front).

Ce returnează

push_* nu returnează nimic. pop_* returnează Option<T>.

Exemple

Exemplul 1: Ambele capete

use std::collections::VecDeque;

fn main() {
    let mut d = VecDeque::new();
    d.push_back(2);
    d.push_back(3);
    d.push_front(1);
    d.push_front(0);
    println!("{:?}", d);
    println!("pop_front = {:?}", d.pop_front());
    println!("pop_back = {:?}", d.pop_back());
    println!("rămân {:?}", d);
}

Rezultat

[0, 1, 2, 3]
pop_front = Some(0)
pop_back = Some(3)
rămân [1, 2]

Exemplul 2: E palindrom?

Păstrăm doar literele, mici. Apoi scoatem câte o literă din fiecare capăt și le comparăm.

use std::collections::VecDeque;

fn palindrom(text: &str) -> bool {
    let mut litere: VecDeque<char> = text
        .chars()
        .filter(|c| c.is_alphanumeric())
        .flat_map(|c| c.to_lowercase())
        .collect();
    while litere.len() > 1 {
        if litere.pop_front() != litere.pop_back() {
            return false;
        }
    }
    true
}

fn main() {
    for t in ["Ele fac cafele", "Ene purta patru pene", "Rust e fain"] {
        println!("{t:22} -> {}", palindrom(t));
    }
}

Rezultat

Ele fac cafele         -> true
Ene purta patru pene   -> true
Rust e fain            -> false

Exemplul 3: Cereri urgente trec în față

Cererile normale intră la coadă, cele urgente în față; procesarea se face mereu din față.

use std::collections::VecDeque;

fn main() {
    let mut cereri = VecDeque::new();
    for (text, urgent) in [("factură", false), ("parolă uitată", false), ("server căzut", true), ("ofertă", false)] {
        if urgent {
            cereri.push_front(text);
        } else {
            cereri.push_back(text);
        }
    }
    while let Some(c) = cereri.pop_front() {
        println!("rezolv: {c}");
    }
}

Rezultat

rezolv: server căzut
rezolv: factură
rezolv: parolă uitată
rezolv: ofertă

Greșeli frecvente

  • Te aștepți ca pop_front să returneze direct elementul: rezultatul este Option<T>. Folosește while let Some(x) = c.pop_front().
  • Confunzi capetele: front este începutul (poziția 0), back este sfârșitul.

Comenzi înrudite

  • VecDeque: Coada cu două capete: adaugă și scoate rapid elemente atât la început, cât și la sfârșit.
  • VecDeque::front: Arată primul (front) sau ultimul (back) element al cozii, fără să-l scoată; None dacă coada e goală.
  • Vec::push: push adaugă un element la sfârșitul vectorului; pop îl scoate pe ultimul și îl returnează ca Option.
  • BinaryHeap: Coadă de priorități: pop scoate mereu cel mai mare element, iar peek îl arată fără să-l scoată.