CodeNebula
C++11stlintermediate

std::deque (C++11 Evolution)

C++11 · Modern Revolution · Compiler flag: -std=c++11

Explanation

Double-ended queue, supports move semantics and `emplace`.

Real-World Scenario

Add tasks to a scheduler queue efficiently.

Quick Snippet

snippet.cpp
#include <deque> std::deque<int> dq; dq.emplace_back(1);

Full Example

deque.cpp
// CodeNebula - C++11 Example: deque (C++11 Features)
// Compile: g++ -std=c++11 -Wall -Wextra -o example deque.cpp

// Demonstrates C++11-specific std::deque features: initializer list,
// emplace_front, emplace_back, shrink_to_fit, and move semantics.

#include <iostream>
#include <deque>
#include <string>

int main() {
    // Initializer list construction (C++11)
    std::deque<int> dq = {10, 20, 30, 40, 50};
    std::cout << "=== Initializer list ===\n";
    for (const auto& v : dq) std::cout << v << " ";
    std::cout << "\n\n";

    // emplace_front and emplace_back: construct in-place
    std::cout << "=== emplace_front / emplace_back ===\n";
    std::deque<std::string> names;
    names.emplace_back("Charlie");
    names.emplace_back("Diana");
    names.emplace_front("Bob");
    names.emplace_front("Alice");
    for (const auto& n : names) std::cout << n << " ";
    std::cout << "\n\n";

    // emplace: construct at arbitrary position
    std::cout << "=== emplace at position ===\n";
    auto it = names.begin() + 2;  // before "Charlie"
    names.emplace(it, "Brenda");
    for (const auto& n : names) std::cout << n << " ";
    std::cout << "\n\n";

    // shrink_to_fit: request to reduce memory usage
    std::cout << "=== shrink_to_fit ===\n";
    std::deque<int> big;
    for (int i = 0; i < 1000; ++i) big.push_back(i);
    big.clear();
    std::cout << "Size after clear: " << big.size() << "\n";
    big.shrink_to_fit();
    std::cout << "shrink_to_fit called\n\n";

    // Move semantics
    std::cout << "=== Move semantics ===\n";
    std::deque<int> src = {1, 2, 3, 4, 5};
    std::cout << "src size before: " << src.size() << "\n";
    std::deque<int> dst = std::move(src);
    std::cout << "dst size after:  " << dst.size() << "\n";
    std::cout << "src size after:  " << src.size() << "\n";

    // Range-based for with auto (C++11)
    std::cout << "\ndst contents: ";
    for (auto val : dst) std::cout << val << " ";
    std::cout << "\n";

    return 0;
}

// Expected output:
// === Initializer list ===
// 10 20 30 40 50
//
// === emplace_front / emplace_back ===
// Alice Bob Charlie Diana
//
// === emplace at position ===
// Alice Bob Brenda Charlie Diana
//
// === shrink_to_fit ===
// Size after clear: 0
// shrink_to_fit called
//
// === Move semantics ===
// src size before: 5
// dst size after:  5
// src size after:  0
//
// dst contents: 1 2 3 4 5
Run command
g++ -std=c++11 -Wall -Wextra -o example deque.cpp