CodeNebula
C++11stlintermediate

std::stack (C++11 Evolution)

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

Explanation

LIFO container adaptor, supports move semantics and `emplace`.

Real-World Scenario

Add undo operations to a text editor efficiently.

Quick Snippet

snippet.cpp
#include <stack> std::stack<int> stk; stk.emplace(1);

Full Example

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

// Demonstrates C++11-specific std::stack features: emplace (construct
// in-place on top), swap, and move semantics.

#include <iostream>
#include <stack>
#include <string>
#include <utility>

int main() {
    // emplace: construct element directly on top of the stack
    std::cout << "=== emplace ===\n";
    std::stack<std::pair<std::string, int>> tasks;
    tasks.emplace("Write code", 1);
    tasks.emplace("Run tests", 2);
    tasks.emplace("Deploy", 3);

    std::cout << "Top: (" << tasks.top().first << ", "
              << tasks.top().second << ")\n";
    std::cout << "Size: " << tasks.size() << "\n\n";

    // Pop and display all elements (LIFO order)
    std::cout << "=== Pop all (LIFO) ===\n";
    while (!tasks.empty()) {
        auto& t = tasks.top();
        std::cout << "  (" << t.first << ", " << t.second << ")\n";
        tasks.pop();
    }
    std::cout << "\n";

    // swap: exchange contents of two stacks
    std::cout << "=== swap ===\n";
    std::stack<int> s1, s2;
    s1.push(10); s1.push(20); s1.push(30);
    s2.push(100); s2.push(200);

    std::cout << "Before swap: s1.top=" << s1.top()
              << " s2.top=" << s2.top() << "\n";
    s1.swap(s2);
    std::cout << "After swap:  s1.top=" << s1.top()
              << " s2.top=" << s2.top() << "\n";
    std::cout << "s1.size=" << s1.size()
              << " s2.size=" << s2.size() << "\n\n";

    // Move semantics
    std::cout << "=== Move semantics ===\n";
    std::stack<int> src;
    src.push(1); src.push(2); src.push(3);
    std::cout << "src size before: " << src.size() << "\n";
    std::stack<int> dst = std::move(src);
    std::cout << "dst size after:  " << dst.size() << "\n";
    std::cout << "dst top:         " << dst.top() << "\n";
    std::cout << "src size after:  " << src.size() << "\n";

    return 0;
}

// Expected output:
// === emplace ===
// Top: (Deploy, 3)
// Size: 3
//
// === Pop all (LIFO) ===
//   (Deploy, 3)
//   (Run tests, 2)
//   (Write code, 1)
//
// === swap ===
// Before swap: s1.top=30 s2.top=200
// After swap:  s1.top=200 s2.top=30
// s1.size=2 s2.size=3
//
// === Move semantics ===
// src size before: 3
// dst size after:  3
// dst top:         3
// src size after:  0
Run command
g++ -std=c++11 -Wall -Wextra -o example stack.cpp