1. C++算法库概览
作为C++开发者,STL算法库是我们日常编程中最强大的工具之一。这些算法提供了一套高效、通用的操作集合,可以应用于各种容器类型。不同于手动编写循环,使用标准算法能带来以下几个显著优势:
- 代码更简洁:避免了重复的循环结构
- 性能更优:许多算法经过高度优化
- 更安全:减少了边界条件错误
- 可读性更强:算法名称直接表达了意图
STL算法主要分为以下几大类:
- 非修改序列算法:不改变容器内容
- 修改序列算法:会改变容器内容
- 排序和相关算法:处理有序数据
- 堆算法:构建和操作堆结构
- 数值算法:数学计算
- 其他实用算法
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
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);
}
find_if则更灵活,可以接受谓词函数:
cpp复制auto it = find_if(nums.begin(), nums.end(), [](int x) {
return x > 6 && x % 2 == 1;
});
提示:对于已排序的容器,应优先使用
binary_search等更高效的查找算法
2.1.2 find_end与search
find_end查找子序列的最后一次出现:
cpp复制vector<int> main = {1,2,3,4,1,2,3};
vector<int> sub = {1,2};
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, 2, 3, 2, 4};
int twos = count(vec.begin(), vec.end(), 2); // 返回3
count_if则根据条件统计:
cpp复制int evens = count_if(vec.begin(), vec.end(), [](int x) {
return x % 2 == 0;
});
2.3 遍历算法for_each
for_each是最常用的遍历算法:
cpp复制vector<int> nums = {1, 2, 3};
for_each(nums.begin(), nums.end(), [](int& x) {
x *= 2; // 修改元素
cout << x << " ";
});
注意:C++17引入了执行策略参数,可以指定并行执行:
cpp复制for_each(execution::par, nums.begin(), nums.end(), [](int& x){...});
2.4 比较算法
2.4.1 equal与mismatch
equal判断两个范围是否相等:
cpp复制vector<int> a = {1, 2, 3};
vector<int> b = {1, 2, 3};
bool same = equal(a.begin(), a.end(), b.begin());
mismatch找出第一个不匹配的位置:
cpp复制auto p = mismatch(a.begin(), a.end(), b.begin()
