Files
Data-Structure/STL/STL-Algorithm/README.MD
e2hang 0ea4e65fba STL
2025-08-01 11:20:21 +08:00

147 lines
6.9 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.

STL 中的 `<algorithm>` 头文件是 C++ 标准库中最强大、最常用的部分之一,提供了大量通用算法函数,能与任意容器(`vector`, `list`, `deque`, `array`, `set` 等)协同使用。
下面是 `#include <algorithm>`**全部主要算法的用法大全**,按功能分类汇总:
---
## 🧮 一、非修改序列操作
| 函数 | 作用 |
| ------------------------------------ | ----------------- |
| `all_of(begin, end, pred)` | 是否所有元素都满足条件 |
| `any_of(begin, end, pred)` | 是否有任意元素满足条件 |
| `none_of(begin, end, pred)` | 所有元素都不满足条件 |
| `for_each(begin, end, func)` | 对所有元素执行函数 |
| `count(begin, end, val)` | 统计某值出现次数 |
| `count_if(begin, end, pred)` | 满足条件的个数 |
| `mismatch(begin1, end1, begin2)` | 找出两个序列第一个不匹配的位置 |
| `equal(begin1, end1, begin2)` | 判断两个序列是否相等 |
| `find(begin, end, val)` | 查找某值 |
| `find_if(begin, end, pred)` | 查找满足条件的第一个元素 |
| `find_if_not(begin, end, pred)` | 查找第一个不满足条件的元素 |
| `adjacent_find(begin, end)` | 查找连续重复的元素 |
| `search(begin1, end1, begin2, end2)` | 在一个序列中查找子序列 |
| `search_n(begin, end, count, val)` | 查找连续 count 个相同元素 |
| `find_end(...)` | 查找最后一次出现的子序列 |
| `find_first_of(...)` | 查找第一个在另一个集合中出现的元素 |
---
## ✂️ 二、修改序列操作
| 函数 | 作用 |
| --------------------------------------------- | -------------- |
| `copy(begin, end, dest_begin)` | 拷贝元素 |
| `copy_if(begin, end, dest_begin, pred)` | 拷贝满足条件的元素 |
| `copy_n(begin, n, dest)` | 拷贝 n 个元素 |
| `move(begin, end, dest)` | 移动元素 |
| `swap_ranges(begin1, end1, begin2)` | 交换两个范围的元素 |
| `fill(begin, end, val)` | 填充区间 |
| `fill_n(begin, n, val)` | 填充 n 个元素 |
| `generate(begin, end, func)` | 用函数生成数据填充 |
| `generate_n(begin, n, func)` | 生成 n 个元素填充 |
| `remove(begin, end, val)` | 移除某个值(不改变容器大小) |
| `remove_if(begin, end, pred)` | 移除满足条件的元素 |
| `replace(begin, end, old_val, new_val)` | 替换值 |
| `replace_if(begin, end, pred, new_val)` | 满足条件的元素替换为新值 |
| `reverse(begin, end)` | 反转 |
| `rotate(begin, middle, end)` | 旋转元素(左移) |
| `shuffle(begin, end, rng)` | 随机打乱C++11 |
| `unique(begin, end)` | 删除连续重复元素 |
| `transform(begin, end, dest, func)` | 一元函数转换 |
| `transform(begin1, end1, begin2, dest, func)` | 二元函数转换 |
---
## 🔍 三、排序和相关算法
| 函数 | 作用 |
| ------------------------ | ----------- |
| `sort(begin, end)` | 默认升序排序 |
| `sort(begin, end, comp)` | 自定义比较函数排序 |
| `stable_sort(...)` | 稳定排序 |
| `partial_sort(...)` | 部分排序 |
| `partial_sort_copy(...)` | 排序后复制一部分 |
| `nth_element(...)` | 找第 n 小的元素 |
| `is_sorted(...)` | 判断是否已排序 |
| `is_sorted_until(...)` | 返回第一个未排序的位置 |
---
## 📌 四、集合操作(前提:有序)
| 函数 | 作用 |
| ----------------------------------------- | ------------- |
| `merge(begin1, end1, begin2, end2, dest)` | 合并两个有序区间 |
| `inplace_merge(begin, mid, end)` | 原地合并 |
| `includes(...)` | 判断一个集合是否包含另一个 |
| `set_union(...)` | 并集 |
| `set_intersection(...)` | 交集 |
| `set_difference(...)` | 差集 |
| `set_symmetric_difference(...)` | 对称差集A ⊕ B |
---
## 🧩 五、堆操作
| 函数 | 作用 |
| ----------------------- | --------- |
| `make_heap(begin, end)` | 建堆 |
| `push_heap(begin, end)` | 加入新元素后调整 |
| `pop_heap(begin, end)` | 弹出堆顶 |
| `sort_heap(begin, end)` | 堆排序 |
| `is_heap(begin, end)` | 判断是否为堆 |
| `is_heap_until(...)` | 返回第一个非堆位置 |
---
## 🗂 六、最值和比较
| 函数 | 作用 |
| ------------------------------ | -------------- |
| `min(a, b)` / `max(a, b)` | 最小/最大值(支持比较函数) |
| `minmax(a, b)` | 同时取 min 和 max |
| `min_element(begin, end)` | 序列中最小值迭代器 |
| `max_element(begin, end)` | 序列中最大值迭代器 |
| `minmax_element(...)` | 一次遍历取最小和最大元素 |
| `lexicographical_compare(...)` | 字典序比较 |
| `next_permutation(...)` | 下一个排列 |
| `prev_permutation(...)` | 上一个排列 |
| `clamp(val, lo, hi)` | 限制在区间内C++17 |
---
## 🧠 七、数值算法(需 `<numeric>` 头文件)
| 函数 | 作用 |
| ------------------------------ | ----- |
| `accumulate(begin, end, init)` | 求和 |
| `accumulate(..., op)` | 自定义加法 |
| `inner_product(...)` | 内积 |
| `adjacent_difference(...)` | 相邻差 |
| `partial_sum(...)` | 部分和 |
---
## 示例:几个常用算法
```cpp
#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric> // accumulate
int main() {
std::vector<int> v{5, 1, 3, 3, 9, 7};
std::sort(v.begin(), v.end()); // 排序
std::reverse(v.begin(), v.end()); // 反转
auto it = std::find(v.begin(), v.end(), 3); // 查找3
int cnt = std::count(v.begin(), v.end(), 3); // 统计3的个数
int sum = std::accumulate(v.begin(), v.end(), 0); // 求和
for (int x : v) std::cout << x << ' ';
std::cout << "\n3出现在了 " << cnt << " 次,和为 " << sum << std::endl;
}
```