C++ 算法类

写一篇关于c++算法类的技术文档,不要太多,简洁最好

概述

C++ 算法库(<algorithm>)提供了一组高效、类型安全的通用算法,用于操作各种容器和序列。这些算法不依赖于具体容器实现,通过迭代器与数据交互。

核心算法分类

1. 非修改序列算法

  • 查找算法find()find_if()search()binary_search()

  • 计数算法count()count_if()

  • 遍历算法for_each()for_each_n()

2. 修改序列算法

  • 拷贝算法copy()copy_if()copy_n()

  • 填充算法fill()generate()

  • 移除算法remove()remove_if()unique()

  • 变换算法transform()

  • 替换算法replace()replace_if()

3. 排序与相关算法

  • 排序算法sort()stable_sort()partial_sort()

  • 分区算法partition()stable_partition()

  • 第n元素nth_element()

  • 堆操作make_heap()push_heap()pop_heap()

4. 数值算法

  • 累加accumulate()(需 <numeric>

  • 内积inner_product()

  • 相邻差adjacent_difference()

关键特性

迭代器抽象

算法通过迭代器类型定义操作范围:

复制代码
复制代码
复制代码
template<typename InputIt, typename T>
InputIt find(InputIt first, InputIt last, const T& value);

自定义比较

支持函数指针、函数对象、lambda表达式:

复制代码
复制代码
复制代码
std::sort(vec.begin(), vec.end(), 
          [](int a, int b) { return a > b; });

算法复杂度保证

  • std::sort():O(n log n)

  • std::find():O(n)

  • std::binary_search():O(log n)(需随机访问迭代器)

最佳实践

  1. 优先使用标准算法而非手写循环

  2. 注意迭代器有效性,特别是在修改操作后

  3. 使用C++17的并行算法std::execution::par)加速计算

  4. 结合移动语义减少拷贝:C++11后算法自动优化

示例代码

复制代码
复制代码
复制代码
#include <algorithm>
#include <vector>

// 查找大于5的第一个元素
auto it = std::find_if(vec.begin(), vec.end(),
                       [](int x) { return x > 5; });

// 原地排序(降序)
std::sort(vec.begin(), vec.end(), std::greater<>());

// 变换并计算平方
std::transform(vec.begin(), vec.end(), result.begin(),
               [](int x) { return x * x; });

注意事项

  • 修改算法通常返回新范围的结尾迭代器

  • 排序算法要求随机访问迭代器(如vectordeque

  • 关联容器(setmap)有自身排序,通常使用容器方法

该算法库是C++标准库的核心组件,正确使用可显著提升代码的简洁性、可读性和性能。

相关推荐
初願致夕霞1 小时前
C++11:类型推导与完美转发复盘笔记
c++
小猪写代码1 小时前
C++中什么是类,什么是对象
c++
钓鱼的肝5 小时前
梳理(1-5)
c++·经验分享·笔记·算法·青少年编程
jimy16 小时前
readelf 查看“派生类”的vtable符号
开发语言·c++
蒸蒸yyyyzwd6 小时前
cpp 选手秋招学习笔记 day37 面经学习
c++·八股
YYYing.7 小时前
【C++进阶系列 (七)】C++ RTTI 深度剖析:从 typeid 到 dynamic_cast 的底层之旅
开发语言·c++·c/c++·rtti
钓鱼的肝8 小时前
csp-j-s总结(2)
c++·经验分享·笔记·算法·青少年编程
重生的黑客8 小时前
Qt 常用控件精讲(1):QWidget 核心属性全解 —— 从 geometry 到 qrc 与 QSS
c++·qt·qwidget·qss·常用控件
Hespethorn8 小时前
取 `X-Forwarded-For` 首段做频控 key,等于把限流开关交给了调用方
c++
米糕闯编程8 小时前
鱼香ros2(七)功能包组织C++节点
c++·ros2·cmakelists