<list> 数据结构

<list> 是 C++ 标准库中的一个双向链表类模板,提供了灵活的元素插入和删除操作。std::list 是一种序列容器,支持高效的前插和后插操作,适用于需要频繁修改元素位置的场景。

1. 类介绍

std::list 是一个双向链表容器,每个元素都包含指向前一个和后一个元素的指针。这种结构使得在链表中插入和删除元素变得非常高效,但随机访问性能较差。

1.1 基本操作

创建和初始化:

#include <iostream>
#include <list>

int main() {
    // 创建一个空的 list
    std::list<int> lst1;

    // 创建一个指定大小并用默认值初始化的 list
    std::list<int> lst2(10); // 包含 10 个 int 元素,每个元素初始化为 0

    // 创建一个指定大小并用特定值初始化的 list
    std::list<int> lst3(5, 42); // 包含 5 个 int 元素,每个元素初始化为 42

    // 使用列表初始化
    std::list<int> lst4 = {1, 2, 3, 4, 5}; // 使用列表初始化

    return 0;
}

访问元素:

#include <iostream>
#include <list>

int main() {
    std::list<int> lst = {10, 20, 30, 40, 50};

    // 访问元素
    for (const auto& value : lst) {
        std::cout << value << " ";
    }
    std::cout << std::endl;

    return 0;
}

添加和删除元素:

#include <iostream>
#include <list>

int main() {
    std::list<int> lst = {1, 2, 3};

    // 在前面插入元素
    lst.push_front(0);

    // 在末尾插入元素
    lst.push_back(4);

    // 插入元素到指定位置
    auto it = lst.begin();
    ++it; // 移动到第二个位置
    lst.insert(it, 10); // 在第二个位置插入 10

    // 删除指定位置的元素
    it = lst.begin();
    ++it; // 移动到第二个位置
    lst.erase(it); // 删除第二个位置的元素

    // 删除前面和末尾的元素
    lst.pop_front();
    lst.pop_back();

    // 清空所有元素
    lst.clear();

    return 0;
}

合并和排序:

#include <iostream>
#include <list>

int main() {
    std::list<int> lst1 = {3, 1, 4, 1, 5};
    std::list<int> lst2 = {9, 2, 6, 5};

    // 合并两个 list
    lst1.merge(lst2);

    // 排序 list
    lst1.sort();

    // 输出合并和排序后的 list
    for (const auto& value : lst1) {
        std::cout << value << " ";
    }
    std::cout << std::endl;

    return 0;
}

2. 高级操作

迭代器:

#include <iostream>
#include <list>

int main() {
    std::list<int> lst = {1, 2, 3, 4, 5};

    // 使用迭代器遍历
    for (std::list<int>::iterator it = lst.begin(); it != lst.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    // 使用范围-based for 循环
    for (const auto& value : lst) {
        std::cout << value << " ";
    }
    std::cout << std::endl;

    return 0;
}

反转和遍历:

#include <iostream>
#include <list>

int main() {
    std::list<int> lst = {1, 2, 3, 4, 5};

    // 反转 list
    lst.reverse();

    // 输出反转后的 list
    for (const auto& value : lst) {
        std::cout << value << " ";
    }
    std::cout << std::endl;

    return 0;
}

3. 总结

<list> 提供了一个双向链表的实现,支持高效的插入和删除操作。由于其双向链表的特性,std::list 在插入和删除操作中表现优异,但其随机访问性能较差。通过掌握 std::list 的基本操作和高级功能,可以有效地处理需要频繁插入和删除元素的场景。