CodeNebula
C++98stlbeginner

std::queue (Container Adaptor)

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

Explanation

FIFO (first-in, first-out) container adaptor.

Real-World Scenario

Manage print jobs in a printer queue.

Quick Snippet

snippet.cpp
#include <queue> std::queue<int> q; q.push(1);

Full Example

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

// std::queue is a container adaptor that provides FIFO (First In, First Out)
// access. By default it uses std::deque as the underlying container.

#include <iostream>
#include <queue>
#include <list>
#include <string>

int main() {
    // --- Basic operations ---
    std::cout << "=== Basic operations ===" << std::endl;
    std::queue<int> q;
    std::cout << "Empty: " << (q.empty() ? "true" : "false") << std::endl;
    std::cout << "Size: " << q.size() << std::endl;

    // --- push ---
    std::cout << "\n=== push ===" << std::endl;
    q.push(10);
    q.push(20);
    q.push(30);
    q.push(40);
    q.push(50);
    std::cout << "Pushed: 10, 20, 30, 40, 50" << std::endl;
    std::cout << "Size: " << q.size() << std::endl;

    // --- front and back ---
    std::cout << "\n=== front and back ===" << std::endl;
    std::cout << "front: " << q.front() << std::endl;
    std::cout << "back: " << q.back() << std::endl;

    // front() and back() return references; can modify
    q.front() = 11;
    q.back() = 55;
    std::cout << "After modifying: front=" << q.front() << ", back=" << q.back() << std::endl;

    // --- pop ---
    std::cout << "\n=== pop (FIFO order) ===" << std::endl;
    std::cout << "Popping all elements:" << std::endl;
    while (!q.empty()) {
        std::cout << "  front=" << q.front() << ", size=" << q.size() << std::endl;
        q.pop();
    }
    std::cout << "After popping all: empty=" << (q.empty() ? "true" : "false") << std::endl;

    // --- FIFO demonstration ---
    std::cout << "\n=== FIFO order demonstration ===" << std::endl;
    std::queue<std::string> print_queue;
    print_queue.push("Job A (first in)");
    print_queue.push("Job B");
    print_queue.push("Job C");
    print_queue.push("Job D (last in)");

    std::cout << "Processing print queue (FIFO):" << std::endl;
    while (!print_queue.empty()) {
        std::cout << "  Processing: " << print_queue.front() << std::endl;
        print_queue.pop();
    }

    // --- Queue with list as underlying container ---
    std::cout << "\n=== Queue with list backend ===" << std::endl;
    std::queue<int, std::list<int> > list_queue;
    list_queue.push(100);
    list_queue.push(200);
    list_queue.push(300);
    std::cout << "list-backed queue front: " << list_queue.front() << std::endl;
    std::cout << "list-backed queue back: " << list_queue.back() << std::endl;
    std::cout << "Size: " << list_queue.size() << std::endl;

    // --- Comparison operators ---
    std::cout << "\n=== Comparison operators ===" << std::endl;
    std::queue<int> q1, q2;
    q1.push(1); q1.push(2); q1.push(3);
    q2.push(1); q2.push(2); q2.push(3);
    std::cout << "q1 == q2: " << (q1 == q2 ? "true" : "false") << std::endl;

    q2.push(4);
    std::cout << "After q2.push(4): q1 < q2: " << (q1 < q2 ? "true" : "false") << std::endl;
    std::cout << "q1 != q2: " << (q1 != q2 ? "true" : "false") << std::endl;

    // --- Practical: BFS-like level processing ---
    std::cout << "\n=== Practical: level-by-level processing ===" << std::endl;
    std::queue<int> bfs;
    bfs.push(1);

    int level = 0;
    while (!bfs.empty() && level < 3) {
        int level_size = static_cast<int>(bfs.size());
        std::cout << "Level " << level << ": ";
        for (int i = 0; i < level_size; ++i) {
            int node = bfs.front();
            bfs.pop();
            std::cout << node << " ";
            // Simulate adding children
            if (level < 2) {
                bfs.push(node * 2);
                bfs.push(node * 2 + 1);
            }
        }
        std::cout << std::endl;
        ++level;
    }

    return 0;
}

/*
Expected output:
=== Basic operations ===
Empty: true
Size: 0

=== push ===
Pushed: 10, 20, 30, 40, 50
Size: 5

=== front and back ===
front: 10
back: 50
After modifying: front=11, back=55

=== pop (FIFO order) ===
Popping all elements:
  front=11, size=5
  front=20, size=4
  front=30, size=3
  front=40, size=2
  front=55, size=1
After popping all: empty=true

=== FIFO order demonstration ===
Processing print queue (FIFO):
  Processing: Job A (first in)
  Processing: Job B
  Processing: Job C
  Processing: Job D (last in)

=== Queue with list backend ===
list-backed queue front: 100
list-backed queue back: 300
Size: 3

=== Comparison operators ===
q1 == q2: true
After q2.push(4): q1 < q2: true
q1 != q2: true

=== Practical: level-by-level processing ===
Level 0: 1
Level 1: 2 3
Level 2: 4 5 6 7
*/
Run command
g++ -std=c++98 -Wall -Wextra -o example queue.cpp