STL 3算法

文章目录

1. 算法分类

1.非修改序列算法

遍历容器但不修改元素。

std::find(begin, end, value); // 查找首个等于 value 的元素

std::count(begin, end, value); // 统计等于 value 的元素数量

std::for_each(begin, end, func); // 对每个元素应用函数

for_each 是非修改算法,若需改变元素值需通过引用参数(如 [](int& x))

std::all_of/any_of/none_of(begin, end, pred); // 条件判断

1.返回值:

all_of:所有元素满足 p,或区间为空 → true。

any_of:至少一个元素满足 p → true。

none_of:所有元素均不满足 p,或区间为空 → true。

2.短路求值

all_of:遇到第一个不满足 p 的元素时立即返回 false。

any_of:遇到第一个满足 p 的元素时立即返回 true。

none_of:遇到第一个满足 p 的元素时立即返回 false。

2.修改序列算法

修改元素值或重排元素。

std::copy(begin, end, dest); // 复制元素到目标位置

std::fill(begin, end, value); // 用 value 填充区间

std::replace(begin, end, old, new); // 替换旧值为新值

std::remove(begin, end, value); // 移除等于 value 的元素(逻辑删除)

std::reverse(begin, end); // 反转序列

std::shuffle(begin, end, gen); // 随机打乱序列

3.排序与分区算法

对元素进行排序或分区。

std::sort(begin, end); // 快速排序(默认升序)

std::stable_sort(begin, end); // 稳定排序(保持相等元素的相对顺序)

std::partial_sort(begin, mid, end); // 部分排序(前 mid-begin 个元素有序)

std::nth_element(begin, nth, end); // 使得第 nth 个元素处于有序状态下的正确位置

std::partition(begin, end, pred); // 分区(满足条件的元素放前面)

4.二分查找算法

在有序序列中高效查找元素。

std::binary_search(begin, end, value); // 判断元素是否存在

std::lower_bound(begin, end, value); // 第一个不小于 value 的位置

std::upper_bound(begin, end, value); // 第一个大于 value 的位置

std::equal_range(begin, end, value); // 返回相等元素的区间 [lower, upper)

1.记忆方法

  1. lower_bound:下界(第一个 ≥ value 的位置)

    1.功能:查找第一个不小于(≥)目标值的元素位置。

    2.应用场景:

    插入元素时保持有序(确定插入点)。

    范围查询的左边界(如 [lower, upper))。

  2. upper_bound:上界(第一个 > value 的位置)

    1.功能:查找第一个大于(>)目标值的元素位置。

5.集合算法

处理有序序列的交集、并集等操作。

std::merge(begin1, end1, begin2, end2, dest); // 合并两个有序序列

std::set_intersection(begin1, end1, begin2, end2, dest); // 交集

std::set_union(begin1, end1, begin2, end2, dest); // 并集

std::set_difference(begin1, end1, begin2, end2, dest); // 差集

6.数值算法

std::accumulate(begin, end, init); // 累加求和(可自定义操作)

std::partial_sum(begin, end, dest); // 前缀和

std::adjacent_difference(begin, end, dest); // 相邻元素的差

std::inner_product(begin1, end1, begin2, init); // 内积(可自定义操作)

2.关键点总结

1.迭代器类型决定算法适用性

1.例如,std::sort 要求随机访问迭代器,因此无法用于 list(需用 list::sort)。

2.算法复杂度影响性能:

std::binary_search 的 O (log n) 复杂度依赖于有序序列和随机访问迭代器。

2.erase-remove用法

2.使用 std::remove 后需调用 erase 以物理删除元素(erase-remove 惯用法)。

erase-remove 惯用法是处理连续容器(如 vector)中删除元素的标准方式,其核心步骤为:

1.remove 移动元素:将不需要的元素移至末尾,返回新逻辑终点。

2.erase 物理删除:删除新逻辑终点之后的冗余元素。

3.区间表示法

所有 STL 算法操作的是左闭右开区间 [begin, end),即包含 begin 但不包含 end。

相关推荐
辰尘_星启3 分钟前
『CMake』关于使用CMake构建项目时的现代/传统指令
c++·架构·系统·cmake·项目·构建
自信1504130575920 分钟前
初学者小白复盘15之指针(4)
c语言·数据结构·算法
郝学胜-神的一滴20 分钟前
Cesium绘制线:从基础到高级技巧
前端·javascript·程序人生·线性代数·算法·矩阵·图形渲染
AA陈超28 分钟前
虚幻引擎5 GAS开发俯视角RPG游戏 P06-13 属性菜单 - 边框值
c++·游戏·ue5·游戏引擎·虚幻
蒙娜丽宁37 分钟前
Rust 性能优化指南:内存管理、并发调优与基准测试案例
开发语言·性能优化·rust
豐儀麟阁贵1 小时前
5.2 类
java·开发语言
东皇太星1 小时前
机器学习概念,算法原理及应用
算法·机器学习·梯度下降法
九皇叔叔1 小时前
Java循环结构全解析:从基础用法到性能优化(含经典案例)
java·开发语言·python
.格子衫.1 小时前
021数据结构之并查集——算法备赛
数据结构·算法
姝孟1 小时前
C++学习——类与对象详细知识点总结
c++·笔记·学习