1. C++标准库算法概览
作为一名有着十年C++开发经验的工程师,我经常看到新手开发者重复造轮子,手动实现那些标准库已经提供的算法功能。C++标准库中的算法组件是每个C++开发者必须掌握的核心技能,它能极大提升开发效率和代码质量。
标准库算法主要定义在<algorithm>和<numeric>头文件中,涵盖了从简单的查找、排序到复杂的数值计算等各类操作。这些算法通过迭代器与容器交互,具有极高的通用性。根据功能特点,我们可以将其分为以下几大类:
- 非修改序列算法:不改变容器内容,如
find、count等 - 修改序列算法:会改变容器内容,如
copy、transform等 - 排序及相关算法:如
sort、binary_search等 - 数值算法:如
accumulate、inner_product等
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 非修改序列算法详解
2.1 查找算法
查找算法是日常开发中使用频率最高的一类算法,C++提供了多种查找方式以适应不同场景。
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 index: " << distance(data.begin(), it);
}
// 查找第一个大于6的元素
auto it2 = find_if(data.begin(), data.end(), [](int x) {
return x > 6;
});
提示:对于已排序的容器,应优先使用
binary_search等二分查找算法,时间复杂度从O(n)降到O(log n)。
find_end和search用于子序列查找:
cpp复制vector<int> main = {1,2,3,4,1,2,3};
vector<int> sub = {1,2,3};
// 查找最后一次出现的位置
auto last_pos = find_end(main.begin(), main.end(), sub.begin(), sub.end());
// 查找第一次出现的位置
auto first_pos = search(main.begin(), main.end(), sub.begin(), sub.end());
2.2 计数算法
count和count_if提供了灵活的计数能力:
cpp复制vector<int> nums = {1, 2, 2, 3, 2, 4, 2};
// 统计2出现的次数
int twos = count(nums.begin(), nums.end(
