1. C++ STL算法概述
C++标准模板库(STL)提供了丰富的算法,这些算法主要定义在<algorithm>和<numeric>头文件中。STL算法可以分为几大类:非修改序列算法、修改序列算法、排序和相关算法、堆算法以及数值算法等。这些算法通过迭代器与容器交互,具有高度的通用性。
STL算法的优势在于:
- 标准化:提供统一的接口和命名规范
- 高效性:经过高度优化,性能有保障
- 通用性:适用于各种容器类型
- 可组合性:算法可以相互配合使用
2. 非修改序列算法
2.1 查找算法
2.1.1 find和find_if
find是最基础的查找算法,用于在范围内查找特定值:
cpp复制vector<int> nums = {1, 3, 5, 7, 9};
auto it = find(nums.begin(), nums.end(), 5);
if (it != nums.end()) {
cout << "Found at position: " << distance(nums.begin(), it) << endl;
}
find_if则更加灵活,可以接受谓词函数:
cpp复制auto it = find_if(nums.begin(), nums.end(), [](int x) {
return x > 6 && x % 2 == 1;
});
提示:对于自定义类型,需要重载
==运算符或提供自定义比较函数
2.1.2 find_end和search
find_end查找子序列最后一次出现的位置:
cpp复制vector<int> main = {1,2,3,4,1,2,3};
vector<int> sub = {1,2,3};
auto it = find_end(main.begin(), main.end(), sub.begin(), sub.end());
search则是查找子序列第一次出现的位置,与find_end形成互补。
2.2 计数算法
2.2.1 count和count_if
count统计特定值出现的次数:
cpp复制vector<int> vec = {1, 2, 3, 2, 4, 2};
int cnt = count(vec.begin(), vec.end(), 2); // 3
count_if则统计满足条件的元素数量:
cpp复制int even_cnt = count_if(vec.begin(), vec.end(), [](int x) {
return x % 2 == 0;
});
2.3 遍历算法for_each
for_each对范围内每个元素应用函数:
cpp复制vector<int> vec = {1, 2, 3, 4, 5};
for_each(vec.begin(), vec.end(), [](int& x) {
x *= 2;
});
注意:C++17起推荐使用范围for循环替代简单遍历
2.4 比较算法
2.4.1 equal和mismatch
equal判断两个范围是否相等:
cpp复制vector<int> a = {1, 2, 3};
vec
解锁全文
加入我们的会员,获取最新、最热、最精彩的开发者技术内容