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