1. C++标准库算法概述
在C++开发中,标准库算法是我们日常工作中不可或缺的利器。这些算法主要定义在
标准库算法主要分为以下几类:
- 非修改序列算法:不改变容器内容,如查找、计数等
- 修改序列算法:会改变容器内容,如排序、替换等
- 排序和相关算法:提供各种排序和搜索功能
- 数值算法:专门处理数值计算
- 堆算法:提供堆数据结构相关操作
这些算法都采用模板实现,具有极高的通用性。它们通过迭代器与容器交互,这种设计使得算法不依赖于具体容器类型,实现了算法与数据结构的解耦。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 非修改序列算法详解
2.1 查找算法
查找算法是日常开发中使用频率最高的一类算法。find和find_if是最基础的两个查找函数:
cpp复制vector<int> data = {1, 3, 5, 7, 9};
// 查找值为5的元素
auto it = find(data.begin(), data.end(), 5);
if (it != data.end()) {
cout << "Found at position: " << distance(data.begin(), it) << endl;
}
// 查找第一个大于6的元素
auto it2 = find_if(data.begin(), data.end(), [](int x) {
return x > 6;
});
实际开发中,find_if配合lambda表达式非常灵活。我曾经在一个图像处理项目中,用它来查找第一个满足特定颜色阈值的像素点,代码简洁高效。
注意:对于已排序的容器,应该使用binary_search等算法,它们的时间复杂度是O(log n),比线性查找的O(n)更高效。
2.2 计数算法
count和count_if用于统计满足条件的元素数量:
cpp复制vector<int> scores = {85, 92, 78, 90, 85, 87, 85};
int excellent = count_if(scores.begin(), scores.end(), [](int s) {
return s >= 90;
});
cout << "优秀人数: " << excellent << endl;
在我的一个学生成绩分析系统中,这个算法帮助快速统计各分数段人数,避免了手动编写循环的麻烦。
2.3 遍历算法
for_each算法提供了一种函数式风格的容器遍历方式:
cpp复制vector<Employee> staff = {...};
// 给所有员工加薪10%
for_each(staff.begin(), staff.end(), [](Employee& emp) {
emp.salary *= 1.1;
});
