Renewed Structure
This commit is contained in:
157
std-Cpp/STL/STL-List/README.MD
Normal file
157
std-Cpp/STL/STL-List/README.MD
Normal file
@@ -0,0 +1,157 @@
|
||||
下面是 `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 的对比表
|
||||
|
||||
我也可以马上给你。是否继续?
|
54
std-Cpp/STL/STL-List/main.cpp
Normal file
54
std-Cpp/STL/STL-List/main.cpp
Normal file
@@ -0,0 +1,54 @@
|
||||
#include <iostream>
|
||||
#include <list>
|
||||
using namespace std;
|
||||
int main(){
|
||||
list<string> a;
|
||||
a.push_back("1.Ohyeah");
|
||||
a.push_back("2.Ohno");
|
||||
std::list<string>::iterator it = a.begin();
|
||||
auto ite = a.cbegin();
|
||||
cout << *ite << endl;
|
||||
a.insert(++it, "0.Ohoh");
|
||||
a.push_back("3.Ohhoho");
|
||||
for(string x : a){
|
||||
cout << x << " ";
|
||||
}
|
||||
cout << endl;
|
||||
|
||||
//Copy a to b
|
||||
list<string> b(a);
|
||||
|
||||
auto itmp1 = a.begin();
|
||||
itmp1++;
|
||||
auto itmp2 = a.end();
|
||||
itmp2--;
|
||||
a.erase(itmp1, itmp2);
|
||||
|
||||
for(string x : a){
|
||||
cout << x << " ";
|
||||
}
|
||||
cout << endl << endl;
|
||||
//Two Methods going through The Whole List
|
||||
auto iit = a.begin();
|
||||
for(int i = 0; i < a.size(); i++){
|
||||
cout << *iit << " ";
|
||||
iit++;
|
||||
}
|
||||
cout << endl;
|
||||
cout << endl;
|
||||
|
||||
//insert ?
|
||||
for(string x : b){
|
||||
cout << x << " ";
|
||||
}
|
||||
cout << endl;
|
||||
auto itb = b.begin();
|
||||
itb++;itb++;
|
||||
b.insert(itb, a.begin(), a.end()); //insert into pos 2
|
||||
for(string x : b){
|
||||
cout << x << " ";
|
||||
}
|
||||
cout << endl;
|
||||
return 0;
|
||||
}
|
||||
|
Reference in New Issue
Block a user