CodeNebula
C++11stlintermediate

std::list (C++11 Evolution)

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

Explanation

Doubly-linked list, supports move semantics and `emplace`.

Real-World Scenario

Efficiently insert objects into a playlist.

Quick Snippet

snippet.cpp
#include <list> std::list<int> lst; lst.emplace_front(1);

Full Example

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

// Demonstrates C++11-specific std::list features: initializer list,
// emplace, emplace_front/back, sort with lambda, and move semantics.

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

struct Task {
    std::string name;
    int priority;
    Task(std::string n, int p) : name(std::move(n)), priority(p) {}
};

void print_tasks(const std::list<Task>& tasks) {
    for (const auto& t : tasks)
        std::cout << "  [" << t.priority << "] " << t.name << "\n";
}

int main() {
    // Initializer list construction (C++11)
    std::list<int> nums = {5, 3, 1, 4, 2};
    std::cout << "=== Initializer list ===\n";
    for (const auto& n : nums) std::cout << n << " ";
    std::cout << "\n\n";

    // emplace_front / emplace_back: construct in-place
    std::cout << "=== emplace_front / emplace_back ===\n";
    std::list<Task> tasks;
    tasks.emplace_back("Write code", 2);
    tasks.emplace_back("Run tests", 3);
    tasks.emplace_front("Plan design", 1);
    print_tasks(tasks);
    std::cout << "\n";

    // emplace: insert in-place at a position
    std::cout << "=== emplace at position ===\n";
    auto it = tasks.begin();
    std::advance(it, 2);  // point to "Run tests"
    tasks.emplace(it, "Code review", 2);
    print_tasks(tasks);
    std::cout << "\n";

    // sort with lambda (C++11 lambda)
    std::cout << "=== Sort by priority (lambda) ===\n";
    tasks.sort([](const Task& a, const Task& b) {
        return a.priority < b.priority;
    });
    print_tasks(tasks);
    std::cout << "\n";

    // Sort descending
    std::cout << "=== Sort descending ===\n";
    tasks.sort([](const Task& a, const Task& b) {
        return a.priority > b.priority;
    });
    print_tasks(tasks);
    std::cout << "\n";

    // Move semantics
    std::cout << "=== Move semantics ===\n";
    std::list<Task> moved = std::move(tasks);
    std::cout << "Original size: " << tasks.size() << "\n";
    std::cout << "Moved size:    " << moved.size() << "\n";

    return 0;
}

// Expected output:
// === Initializer list ===
// 5 3 1 4 2
//
// === emplace_front / emplace_back ===
//   [1] Plan design
//   [2] Write code
//   [3] Run tests
//
// === emplace at position ===
//   [1] Plan design
//   [2] Write code
//   [2] Code review
//   [3] Run tests
//
// === Sort by priority (lambda) ===
//   [1] Plan design
//   [2] Write code
//   [2] Code review
//   [3] Run tests
//
// === Sort descending ===
//   [3] Run tests
//   [2] Write code
//   [2] Code review
//   [1] Plan design
//
// === Move semantics ===
// Original size: 0
// Moved size:    4
Run command
g++ -std=c++11 -Wall -Wextra -o example list.cpp