CodeNebula
C++98stlbeginner

std::deque

C++98 · The Foundation · Compiler flag: -std=c++98

Explanation

Double-ended queue supporting fast insertions at both ends.

Real-World Scenario

Implement a task queue in a job scheduler.

Quick Snippet

snippet.cpp
#include <deque> std::deque<int> dq = {1, 2, 3};

Full Example

deque.cpp
// CodeNebula - C++98 Example: deque
// Compile: g++ -std=c++98 -Wall -Wextra -o example deque.cpp

// std::deque (double-ended queue) supports fast insertion and removal
// at both ends, plus random access to elements.

#include <iostream>
#include <deque>

void print_deque(const std::string& label, const std::deque<int>& dq) {
    std::cout << label << ": ";
    for (std::deque<int>::const_iterator it = dq.begin(); it != dq.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << "(size=" << dq.size() << ")" << std::endl;
}

int main() {
    // --- Construction ---
    std::cout << "=== Construction ===" << std::endl;
    std::deque<int> dq;
    std::deque<int> dq2(5, 77);
    print_deque("Empty deque", dq);
    print_deque("dq2(5, 77)", dq2);

    // --- push_back and push_front ---
    std::cout << "\n=== push_back and push_front ===" << std::endl;
    dq.push_back(10);
    dq.push_back(20);
    dq.push_back(30);
    print_deque("After push_back 10,20,30", dq);

    dq.push_front(5);
    dq.push_front(1);
    print_deque("After push_front 5,1", dq);

    // --- pop_back and pop_front ---
    std::cout << "\n=== pop_back and pop_front ===" << std::endl;
    dq.pop_back();
    print_deque("After pop_back", dq);

    dq.pop_front();
    print_deque("After pop_front", dq);

    // --- Random access ---
    std::cout << "\n=== Random access ===" << std::endl;
    std::cout << "dq[0] = " << dq[0] << std::endl;
    std::cout << "dq[1] = " << dq[1] << std::endl;
    std::cout << "dq.at(2) = " << dq.at(2) << std::endl;
    std::cout << "dq.front() = " << dq.front() << std::endl;
    std::cout << "dq.back() = " << dq.back() << std::endl;

    // --- Modification via index ---
    std::cout << "\n=== Modification via index ===" << std::endl;
    dq[0] = 99;
    dq.at(1) = 88;
    print_deque("After dq[0]=99, dq.at(1)=88", dq);

    // --- Insert and erase ---
    std::cout << "\n=== Insert and erase ===" << std::endl;
    dq.insert(dq.begin() + 1, 555);
    print_deque("After insert 555 at pos 1", dq);

    dq.erase(dq.begin() + 1);
    print_deque("After erase at pos 1", dq);

    // --- Iteration ---
    std::cout << "\n=== Iteration ===" << std::endl;
    // Rebuild for cleaner output
    dq.clear();
    for (int i = 1; i <= 6; ++i) {
        dq.push_back(i * 10);
    }

    std::cout << "Forward:  ";
    for (std::deque<int>::iterator it = dq.begin(); it != dq.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    std::cout << "Reverse:  ";
    for (std::deque<int>::reverse_iterator rit = dq.rbegin(); rit != dq.rend(); ++rit) {
        std::cout << *rit << " ";
    }
    std::cout << std::endl;

    std::cout << "By index: ";
    for (std::deque<int>::size_type i = 0; i < dq.size(); ++i) {
        std::cout << dq[i] << " ";
    }
    std::cout << std::endl;

    // --- resize ---
    std::cout << "\n=== resize ===" << std::endl;
    dq.resize(3);
    print_deque("After resize(3)", dq);

    dq.resize(6, 0);
    print_deque("After resize(6, 0)", dq);

    // --- swap ---
    std::cout << "\n=== swap ===" << std::endl;
    std::deque<int> other(3, 42);
    print_deque("dq before swap", dq);
    print_deque("other before swap", other);
    dq.swap(other);
    print_deque("dq after swap", dq);
    print_deque("other after swap", other);

    // --- empty and clear ---
    std::cout << "\n=== empty and clear ===" << std::endl;
    std::cout << "dq.empty() = " << (dq.empty() ? "true" : "false") << std::endl;
    dq.clear();
    std::cout << "After clear: dq.empty() = " << (dq.empty() ? "true" : "false") << std::endl;

    return 0;
}

/*
Expected output:
=== Construction ===
Empty deque: (size=0)
dq2(5, 77): 77 77 77 77 77 (size=5)

=== push_back and push_front ===
After push_back 10,20,30: 10 20 30 (size=3)
After push_front 5,1: 1 5 10 20 30 (size=5)

=== pop_back and pop_front ===
After pop_back: 1 5 10 20 (size=4)
After pop_front: 5 10 20 (size=3)

=== Random access ===
dq[0] = 5
dq[1] = 10
dq.at(2) = 20
dq.front() = 5
dq.back() = 20

=== Modification via index ===
After dq[0]=99, dq.at(1)=88: 99 88 20 (size=3)

=== Insert and erase ===
After insert 555 at pos 1: 99 555 88 20 (size=4)
After erase at pos 1: 99 88 20 (size=3)

=== Iteration ===
Forward:  10 20 30 40 50 60
Reverse:  60 50 40 30 20 10
By index: 10 20 30 40 50 60

=== resize ===
After resize(3): 10 20 30 (size=3)
After resize(6, 0): 10 20 30 0 0 0 (size=6)

=== swap ===
dq before swap: 10 20 30 0 0 0 (size=6)
other before swap: 42 42 42 (size=3)
dq after swap: 42 42 42 (size=3)
other after swap: 10 20 30 0 0 0 (size=6)

=== empty and clear ===
dq.empty() = false
After clear: dq.empty() = true
*/
Run command
g++ -std=c++98 -Wall -Wextra -o example deque.cpp