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

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(...) 部分和

示例:几个常用算法

#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;
}