Files
Data-Structure/STL/STL-List/README.MD
e2hang c5fcf58332 STL
2025-08-01 00:26:26 +08:00

158 lines
5.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

下面是 `C++ STL list`(即 `std::list`)的**完整用法大全**,涵盖常用成员函数、迭代器、操作与用法示例,并结合功能分类。
---
## 🧠 基础定义
```cpp
#include <list>
std::list<int> a; // 空 list
std::list<int> b(10); // 包含10个默认值的listint为0
std::list<int> c(5, 42); // 包含5个42的list
std::list<int> d(b); // 拷贝构造
std::list<int> e = {1, 2, 3}; // 列表初始化C++11
```
---
## 🚀 成员函数分类总览
### ✅ 容器状态
| 函数名 | 说明 |
| ---------------- | --------------- |
| `empty()` | 判断是否为空 |
| `size()` | 返回元素数量 |
| `max_size()` | 返回容器可容纳的最大元素数量 |
| `clear()` | 清空所有元素 |
| `resize(n)` | 调整大小,若变大则用默认值补充 |
| `resize(n, val)` | 同上,指定补充值 |
---
### ✅ 元素访问
| 函数名 | 说明 |
| --------- | ----------- |
| `front()` | 返回第一个元素的引用 |
| `back()` | 返回最后一个元素的引用 |
---
### ✅ 迭代器
| 函数名 | 说明 |
| ----------- | --------------- |
| `begin()` | 指向第一个元素的迭代器 |
| `end()` | 指向最后一个元素之后的位置 |
| `rbegin()` | 反向迭代器(从后向前)开始位置 |
| `rend()` | 反向迭代器的终点 |
| `cbegin()` | const版本 |
| `cend()` | const版本 |
| `crbegin()` | const版本 |
| `crend()` | const版本 |
---
### ✅ 插入/删除操作
| 函数名 | 说明 |
| ------------------------- | ---------------------- |
| `push_front(val)` | 插入元素到头部 |
| `push_back(val)` | 插入元素到尾部 |
| `pop_front()` | 删除头部元素 |
| `pop_back()` | 删除尾部元素 |
| `insert(it, val)` | 在迭代器 it 位置插入 val |
| `insert(it, n, val)` | 在 it 处插入 n 个 val |
| `insert(it, first, last)` | 插入一个区间(\[first, last) |
| `erase(it)` | 删除 it 处元素 |
| `erase(first, last)` | 删除区间元素 |
| `remove(val)` | 删除所有等于 val 的元素 |
| `remove_if(pred)` | 删除满足谓词 pred 的元素 |
| `clear()` | 清空所有元素 |
| `emplace(it, args...)` | 原地构造插入元素 |
| `emplace_front(args...)` | 原地构造插入到头部 |
| `emplace_back(args...)` | 原地构造插入到尾部 |
---
### ✅ 排序与唯一化
| 函数名 | 说明 |
| -------------------- | ---------------- |
| `sort()` | 默认从小到大排序 |
| `sort(comp)` | 自定义排序 |
| `unique()` | 去除连续重复元素 |
| `reverse()` | 反转元素顺序 |
| `merge(list2)` | 合并两个**已排序**的list |
| `merge(list2, comp)` | 使用自定义比较合并 |
---
### ✅ 赋值与交换
| 函数名 | 说明 |
| --------------------- | -------------- |
| `assign(n, val)` | 赋值 n 个 val |
| `assign(first, last)` | 赋值区间元素 |
| `operator=` | 赋值运算符 |
| `swap(other)` | 与另一个 list 交换数据 |
---
### ✅ splice 操作(转移元素)
| 函数名 | 说明 |
| --------------------------------- | ----------------------------------- |
| `splice(pos, list2)` | 把 list2 的所有元素移动到 pos 前 |
| `splice(pos, list2, it)` | 把 list2 中的 it 元素移动到 pos 前 |
| `splice(pos, list2, first, last)` | 把 list2 的 \[first,last) 区间移动到 pos 前 |
---
## 🧪 示例
```cpp
#include <iostream>
#include <list>
using namespace std;
int main() {
list<int> a = {1, 2, 3};
a.push_front(0); // 0 1 2 3
a.push_back(4); // 0 1 2 3 4
auto it = a.begin();
advance(it, 2);
a.insert(it, 99); // 0 1 99 2 3 4
a.remove(99); // 删除所有值为99的元素
a.reverse(); // 反转列表
for (int x : a) cout << x << " ";
return 0;
}
```
---
## ✅ list 特点总结
| 特性 | 是否支持 |
| ------ | -------------------------- |
| 随机访问 | ❌ 不支持(不像 `vector` 能用 `[]` |
| 快速插入删除 | ✅ O(1) 时间在任意位置 |
| 迭代器稳定性 | ✅ 删除/插入不会使其他迭代器失效 |
| 元素连续性 | ❌ 元素不连续(不像数组或 vector |
| 双向链表结构 | ✅ 是 |
---
如果你还想要:
* 可复制的全套模板代码
* 对每个函数的代码演示例子
* list 和 vector 的对比表
我也可以马上给你。是否继续?