std::deque în C++

Coadă cu două capete: adăugare și ștergere rapidă atât la început, cât și la sfârșit, plus acces după poziție.

Sintaxă
#include <deque>

std::deque<T> nume;
void push_front(const T& valoare);
void pop_front();
// plus push_back, pop_back, operator[], at, front, back

Ce face std::deque

std::deque (citit „deck”, de la double-ended queue) seamănă cu std::vector: are push_back, pop_back, operator[], at, size. În plus, are push_front și pop_front, care adaugă și șterg rapid la început, lucru pe care un vector îl face încet.

Elementele nu stau într-o singură zonă continuă, ci în mai multe blocuri. De aceea nu are data() și nu are reserve. Inserarea la capete invalidează iteratorii, dar referințele la elementele existente rămân valide.

Folosește std::deque pentru cozi și ferestre glisante (adaugi la un capăt, scoți de la celălalt). Este containerul folosit implicit de std::queue și std::stack.

Parametri

Parametru Descriere
valoare Pentru push_front: elementul adăugat la început.

Ce returnează

push_front și pop_front nu returnează nimic. Citește primul element cu front() înainte de pop_front().

Exemple

Exemplul 1: Adăugare la ambele capete

#include <deque>
#include <print>
#include <string>

int main() {
    std::deque<std::string> rand{"Ana", "Ion"};
    rand.push_back("Maria");        // la coadă
    rand.push_front("Doamna Pop");  // cu prioritate, în față
    std::println("{}", rand);
    std::println("Al doilea: {}", rand[1]);

    std::println("Servim: {}", rand.front());
    rand.pop_front();
    std::println("{}", rand);
}

Rezultat

["Doamna Pop", "Ana", "Ion", "Maria"]
Al doilea: Ana
Servim: Doamna Pop
["Ana", "Ion", "Maria"]

Exemplul 2: Ultimele 3 temperaturi (fereastră glisantă)

#include <deque>
#include <print>

int main() {
    std::deque<int> ultimele;
    for (int t : {12, 15, 11, 18, 20, 17}) {
        ultimele.push_back(t);
        if (ultimele.size() > 3) {
            ultimele.pop_front();    // scoatem cea mai veche valoare
        }
        std::println("după {:>2}: {}", t, ultimele);
    }
}

Rezultat

după 12: [12]
după 15: [12, 15]
după 11: [12, 15, 11]
după 18: [15, 11, 18]
după 20: [11, 18, 20]
după 17: [18, 20, 17]

Greșeli frecvente

  • Apelezi pop_front() sau front() pe un deque gol: comportament nedefinit, ca la vector.
  • Folosești std::deque doar „pentru că poate mai mult”. Pentru acces după poziție și parcurgere, std::vector este mai rapid; alege deque doar când adaugi sau scoți des de la început.

Comenzi înrudite

  • std::vector: Tabloul dinamic din C++: ține elementele unul după altul în memorie și își mărește singur dimensiunea.
  • std::queue: Coadă (FIFO): adaugi la coadă cu push și servești de la început cu front și pop.
  • std::stack: Stivă (LIFO): adaugi deasupra cu push, citești vârful cu top și îl scoți cu pop.
  • std::list: Listă dublu înlănțuită: inserare și ștergere rapidă oriunde, fără invalidarea celorlalte elemente, dar fără acces după poziție.