158 lines
5.2 KiB
Markdown
158 lines
5.2 KiB
Markdown
下面是 `C++ STL list`(即 `std::list`)的**完整用法大全**,涵盖常用成员函数、迭代器、操作与用法示例,并结合功能分类。
|
||
|
||
---
|
||
|
||
## 🧠 基础定义
|
||
|
||
```cpp
|
||
#include <list>
|
||
std::list<int> a; // 空 list
|
||
std::list<int> b(10); // 包含10个默认值的list(int为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 的对比表
|
||
|
||
我也可以马上给你。是否继续?
|