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()saufront()pe un deque gol: comportament nedefinit, ca la vector. - Folosești
std::dequedoar „pentru că poate mai mult”. Pentru acces după poziție și parcurgere,std::vectoreste 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.