C++ 标准库中的 <algorithm>
提供了丰富的通用算法,主要用于操作容器(如 vector
, list
, array
等)。这些算法通常通过迭代器(如 begin()
, end()
)访问数据,不直接操作容器本身。以下是主要分类及常用算法:
1. 非修改序列操作(不改变容器内容)
算法 | 功能 | 示例 |
---|
std::all_of | 检查所有元素是否满足条件 | if (all_of(v.begin(), v.end(), [](int x){ return x > 0; })) |
std::any_of | 检查是否有任意元素满足条件 | if (any_of(v.begin(), v.end(), [](int x){ return x < 0; })) |
std::none_of | 检查是否没有元素满足条件 | if (none_of(v.begin(), v.end(), [](int x){ return x == 0; })) |
std::for_each | 对每个元素执行操作 | for_each(v.begin(), v.end(), [](int& x){ x *= 2; }); |
std::count | 统计等于某值的元素个数 | int n = count(v.begin(), v.end(), 42); |
std::count_if | 统计满足条件的元素个数 | int n = count_if(v.begin(), v.end(), [](int x){ return x % 2 == 0; }); |
std::find | 查找第一个等于某值的元素 | auto it = find(v.begin(), v.end(), 42); |
std::find_if | 查找第一个满足条件的元素 | auto it = find_if(v.begin(), v.end(), [](int x){ return x > 100; }); |
std::find_if_not | 查找第一个不满足条件的元素 | auto it = find_if_not(v.begin(), v.end(), [](int x){ return x < 0; }); |
std::search | 在序列中查找子序列 | auto it = search(v1.begin(), v1.end(), v2.begin(), v2.end()); |
2. 修改序列操作(可能改变容器内容)
算法 | 功能 | 示例 |
---|
std::copy | 复制元素到目标位置 | copy(src.begin(), src.end(), dest.begin()); |
std::copy_if | 复制满足条件的元素 | copy_if(v.begin(), v.end(), back_inserter(dest), [](int x){ return x > 0; }); |
std::move | 移动元素(C++11) | move(src.begin(), src.end(), dest.begin()); |
std::fill | 填充元素为指定值 | fill(v.begin(), v.end(), 0); |
std::generate | 用函数生成值填充 | generate(v.begin(), v.end(), rand); |
std::replace | 替换等于某值的元素 | replace(v.begin(), v.end(), 0, 42); |
std::replace_if | 替换满足条件的元素 | replace_if(v.begin(), v.end(), [](int x){ return x < 0; }, 0); |
std::remove | 删除等于某值的元素(逻辑删除) | auto it = remove(v.begin(), v.end(), 0); |
std::remove_if | 删除满足条件的元素 | auto it = remove_if(v.begin(), v.end(), [](int x){ return x % 2 == 0; }); |
std::reverse | 反转序列 | reverse(v.begin(), v.end()); |
std::rotate | 循环移动元素 | rotate(v.begin(), v.begin() + 2, v.end()); |
std::shuffle | 随机打乱序列(C++11) | shuffle(v.begin(), v.end(), std::default_random_engine()); |
std::unique | 去除相邻重复元素 | auto it = unique(v.begin(), v.end()); |
3. 排序与二分查找
算法 | 功能 | 示例 |
---|
std::sort | 对序列排序(默认升序) | sort(v.begin(), v.end()); |
std::stable_sort | 稳定排序(保持相等元素顺序) | stable_sort(v.begin(), v.end()); |
std::partial_sort | 部分排序(前N个元素有序) | partial_sort(v.begin(), v.begin() + 5, v.end()); |
std::nth_element | 使第n个元素处于正确位置 | nth_element(v.begin(), v.begin() + 3, v.end()); |
std::binary_search | 二分查找(返回是否找到) | bool found = binary_search(v.begin(), v.end(), 42); |
std::lower_bound | 返回第一个不小于某值的迭代器 | auto it = lower_bound(v.begin(), v.end(), 42); |
std::upper_bound | 返回第一个大于某值的迭代器 | auto it = upper_bound(v.begin(), v.end(), 42); |
std::equal_range | 返回等于某值的范围(pair) | auto p = equal_range(v.begin(), v.end(), 42); |
4. 堆操作(优先队列底层实现)
算法 | 功能 | 示例 |
---|
std::make_heap | 将序列构建为堆 | make_heap(v.begin(), v.end()); |
std::push_heap | 向堆中添加元素 | v.push_back(99); push_heap(v.begin(), v.end()); |
std::pop_heap | 从堆中移除堆顶元素 | pop_heap(v.begin(), v.end()); v.pop_back(); |
std::sort_heap | 堆排序 | sort_heap(v.begin(), v.end()); |
5. 数值操作(需 <numeric>
头文件)
算法 | 功能 | 示例 |
---|
std::accumulate | 累加(或自定义操作) | int sum = accumulate(v.begin(), v.end(), 0); |
std::inner_product | 计算内积 | int dot = inner_product(v1.begin(), v1.end(), v2.begin(), 0); |
std::partial_sum | 计算前缀和 | partial_sum(v.begin(), v.end(), dest.begin()); |
std::adjacent_difference | 计算相邻差值 | adjacent_difference(v.begin(), v.end(), dest.begin()); |
6. 其他实用算法
算法 | 功能 | 示例 |
---|
std::max_element | 返回最大元素的迭代器 | auto it = max_element(v.begin(), v.end()); |
std::min_element | 返回最小元素的迭代器 | auto it = min_element(v.begin(), v.end()); |
std::minmax_element | 返回最小和最大元素的迭代器(C++11) | auto [min_it, max_it] = minmax_element(v.begin(), v.end()); |
std::lexicographical_compare | 字典序比较两个序列 | bool cmp = lexicographical_compare(v1.begin(), v1.end(), v2.begin(), v2.end()); |
std::next_permutation | 生成下一个排列 | next_permutation(v.begin(), v.end()); |
std::prev_permutation | 生成上一个排列 | prev_permutation(v.begin(), v.end()); |
总结
- 非修改操作:
find
, count
, for_each
等。 - 修改操作:
copy
, replace
, remove
, reverse
等。 - 排序与查找:
sort
, binary_search
, lower_bound
等。 - 堆操作:
make_heap
, push_heap
等。 - 数值计算:
accumulate
, inner_product
(需 <numeric>
)。
建议: