C++ STL list 超详细教程(新手友好)

std::list 是 C++ STL 标准库中的双向链表容器,专门用于频繁插入、删除元素的场景,是编程中最常用的容器之一。

我会用最通俗的语言,带你从零学会 list 的所有核心用法,直接复制就能运行!


一、list 是什么?

  1. 本质:双向循环链表
  2. 优点
    • 任意位置插入/删除元素极快(时间复杂度 O(1))
    • 插入删除不会导致迭代器失效
    • 不需要提前分配空间,无容量限制
  3. 缺点
    • 不支持随机访问(不能用 list[i] 直接访问第 i 个元素)
    • 比 vector 占用更多内存
  4. 适用场景:需要频繁在中间增删元素、不在乎随机访问

二、头文件与命名空间

使用 list 必须包含头文件:

#include <list>   // 必须
using namespace std; // 简化代码,新手推荐

三、创建 list 对象

1. 空 list

list<int> lst; // 创建一个空的 int 类型链表

2. 指定大小的 list

list<int> lst(5); // 5 个元素,默认值为 0

3. 指定大小 + 初始值

list<int> lst(5, 10); // 5 个 10

4. 用数组/其他容器初始化

int arr[] = {1,2,3,4,5};
list<int> lst(arr, arr + 5); // 用数组初始化

5. 拷贝初始化

list<int> lst1 = {1,2,3};
list<int> lst2(lst1); // 拷贝 lst1

四、最常用:增删改查

✅ 1. 添加元素

list<int> lst;

// 尾部添加
lst.push_back(10);
lst.emplace_back(20); // 效率更高,推荐

// 头部添加
lst.push_front(5);
lst.emplace_front(1);

// 指定位置插入(必须用迭代器)
auto it = lst.begin();
++it; // 指向第二个位置
lst.insert(it, 8); // 在第二个位置插入 8

✅ 2. 删除元素

// 删除尾部
lst.pop_back();

// 删除头部
lst.pop_front();

// 删除指定位置元素
lst.erase(lst.begin());

// 删除所有值为 x 的元素
lst.remove(8);

// 清空整个 list
lst.clear();

✅ 3. 访问元素

list 不支持 [] 访问!

// 访问第一个元素
lst.front();

// 访问最后一个元素
lst.back();

✅ 4. 遍历元素(必须用迭代器 / 范围for)

// 方法1:范围for(最简单,推荐)
for (int num : lst) {
    cout << num << " ";
}

// 方法2:迭代器
for (auto it = lst.begin(); it != lst.end(); ++it) {
    cout << *it << " ";
}

✅ 5. 大小与判空

lst.size();    // 获取元素个数
lst.empty();   // 判断是否为空,空返回 true

五、list 高级实用功能

1. 排序(sort)

list 自带高效排序,不用写算法

lst.sort(); // 默认升序
lst.sort(greater<int>()); // 降序

2. 去重(unique)

删除连续重复元素(先排序再去重效果最好):

lst.sort();
lst.unique();

3. 反转(reverse)

lst.reverse(); // 1 2 3 → 3 2 1

4. 拼接(splice)

把另一个 list 的元素移动过来,不拷贝、效率极高

list<int> a = {1,2};
list<int> b = {3,4};
a.splice(a.end(), b); // a 变成 1 2 3 4,b 变空

5. 交换两个 list

a.swap(b);

六、完整可运行示例

#include <iostream>
#include <list>
using namespace std;

int main() {
    // 1. 创建并初始化
    list<int> lst = {5, 2, 9, 1, 5, 6};

    // 2. 遍历
    cout << "初始:";
    for (int n : lst) cout << n << " ";
    cout << endl;

    // 3. 增删
    lst.push_back(10);
    lst.push_front(0);
    lst.remove(5); // 删除所有 5

    // 4. 排序 + 去重 + 反转
    lst.sort();
    lst.unique();
    lst.reverse();

    // 5. 最终遍历
    cout << "处理后:";
    for (int n : lst) cout << n << " ";
    cout << endl;

    return 0;
}

输出:

初始:5 2 9 1 5 6
处理后:10 9 6 2 1 0

七、list vs vector(必看)

特性 vector(动态数组) list(双向链表)
访问速度 快,支持 [] 随机访问 慢,只能迭代器遍历
插入/删除 中间慢,头尾快 任意位置都极快
内存占用 较大
迭代器失效 扩容时全部失效 只有被删节点失效

简单口诀

  • 查得多、不怎么增删 → 用 vector
  • 频繁插入删除、不用随机访问 → 用 list

总结

  1. list 是双向链表,插入删除超快不支持随机访问
  2. 必须用 #include <list>
  3. 常用操作:push_backpush_frontpopinserteraseremove
  4. 遍历只能用迭代器范围for
  5. 高级功能:sort()unique()reverse()splice()

你现在已经完全掌握 C++ list 了!需要我给你出几道练习题巩固吗?

0 条评论

目前还没有评论...