当前位置: 首页 > news >正文

C++ STL <algorithm>中泛型算法:查找、排序、修改、统计、生成

C++ STL 中泛型算法:查找、排序、修改、统计、生成

  • 1. algorithm 概述
    • 1.1 常见分类与函数速览
    • 1.2 实战技巧与性能建议
    • 1.3 algorithm 小结
  • 2. algorithm 常用函数
    • 2.1 查找类算法(find 系列)
    • 2.2 排序与重排算法
    • 2.3 最值与比较类算法
    • 2.4 修改类算法(复制 / 删除 / 替换)
    • 2.5 集合与合并算法
    • 2.6 变换与生成算法
    • 2.7 数值算法(来自 numeric)
  • 3. C++ 示例代码
    • 3.1 常用组合技巧
    • 3.2 algorithm 中20个函数

1. algorithm 概述

<algorithm> 是 C++ STL 里最强大、最常用的头文件之一,它提供了200 多个泛型算法,用于处理容器(如 vector, list, deque, array, map 等)的查找、排序、计数、修改等操作。这些算法全部基于迭代器,因此不仅能作用于 STL 容器,也能用于原生数组、指针区间。

C++ 的 <algorithm> 是 STL 的「灵魂」。
它让你不再需要手写 for 循环,而用函数式方式表达算法逻辑,既安全又高效。

💡 一条原则:能用算法的地方,就不要写 for

1.1 常见分类与函数速览

分类常用函数
查找find, find_if, any_of, all_of, none_of, count_if
排序/重排sort, reverse, rotate, nth_element, shuffle
修改copy, remove_if, replace_if, unique, fill, transform
统计/最值count, accumulate, max_element, min_element, clamp
生成iota, generate, fill, generate_n
集合/合并merge, set_union, set_intersection, set_difference

1.2 实战技巧与性能建议

技巧说明
搭配 lambda 表达式函数式写法简洁清晰
配合 erase-remove 惯用法真正删除元素
对 vector 用 sort 替代 map 查找可显著提高缓存局部性
stable_sort 用于保持逻辑顺序UI 列表、日志排序等
⚠️ remove_if 不改变容器大小必须 .erase()
⚠️ 集合算法要求输入有序否则结果错误
算法与并行 STLC++17 起可使用 std::execution::par 并行加速

1.3 algorithm 小结

分类核心算法典型用途
查找find, find_if搜索条件匹配项
排序sort, reverse数据排序与反转
修改remove_if, replace_if, transform批量修改元素
统计count, accumulate数据统计与求和
生成iota, generate创建序列或随机数据
合并merge, set_union合并多个有序数据

2. algorithm 常用函数

下面系统整理出最常用 + 最好用的函数(并分功能分类,含简短示例 )

2.1 查找类算法(find 系列)

这些算法用于在区间 [first, last) 中查找满足条件的元素

函数作用示例
std::find查找第一个等于指定值的元素auto it = std::find(v.begin(), v.end(), 3);
std::find_if查找第一个满足条件的元素auto it = std::find_if(v.begin(), v.end(), [](int x){return x>3;});
std::find_if_not查找第一个不满足条件的元素auto it = std::find_if_not(v.begin(), v.end(), pred);
std::any_of是否存在至少一个元素满足条件bool ok = std::any_of(v.begin(), v.end(), pred);
std::all_of是否所有元素都满足条件bool ok = std::all_of(v.begin(), v.end(), pred);
std::none_of是否所有元素都不满足条件bool ok = std::none_of(v.begin(), v.end(), pred);
std::count统计指定值出现次数int n = std::count(v.begin(), v.end(), 3);
std::count_if统计满足条件的元素数量int n = std::count_if(v.begin(), v.end(), [](int x){return x>5;});

💡 技巧:这些算法不修改容器,仅返回结果或迭代器,可安全用于 const 容器。

2.2 排序与重排算法

函数作用示例
std::sort快速排序(仅随机访问迭代器)std::sort(v.begin(), v.end());
std::stable_sort稳定排序(保持相等元素相对顺序)std::stable_sort(v.begin(), v.end());
std::partial_sort只对前 N 个元素排序std::partial_sort(v.begin(), v.begin()+3, v.end());
std::nth_element找出第 N 小的元素std::nth_element(v.begin(), v.begin()+n, v.end());
std::reverse反转区间std::reverse(v.begin(), v.end());
std::rotate左/右旋转std::rotate(v.begin(), v.begin()+1, v.end());
std::shuffle随机打乱元素std::shuffle(v.begin(), v.end(), std::mt19937{std::random_device{}()});

⚡ 小技巧:nth_element 常用于 快速求中位数 / Top-K 排序

2.3 最值与比较类算法

函数作用示例
std::min / std::max返回两个值的最小 / 最大auto m = std::min(a,b);
std::min_element / std::max_element找最小 / 最大元素迭代器auto it = std::max_element(v.begin(), v.end());
std::clamp限制值在 [low, high] 范围x = std::clamp(x, 0, 100);
std::lexicographical_compare字典序比较两个区间if (lexicographical_compare(a.begin(), a.end(), b.begin(), b.end())) ...

2.4 修改类算法(复制 / 删除 / 替换)

函数作用示例
std::copy拷贝区间std::copy(a.begin(), a.end(), b.begin());
std::copy_if拷贝满足条件的元素std::copy_if(v.begin(), v.end(), out, pred);
std::move移动元素std::move(a.begin(), a.end(), b.begin());
std::fill / std::fill_n填充固定值std::fill(v.begin(), v.end(), 0);
std::replace / std::replace_if替换特定值或条件std::replace(v.begin(), v.end(), 1, 99);
std::remove / std::remove_if删除元素(需配合 erasev.erase(remove_if(v.begin(), v.end(), pred), v.end());
std::unique删除连续重复元素(需配合 erasev.erase(unique(v.begin(), v.end()), v.end());

⚠️ remove 系列只是逻辑删除(移动不需要的元素到尾部),真正删除需要 v.erase(…)

2.5 集合与合并算法

函数作用示例
std::merge合并两个有序区间std::merge(a.begin(), a.end(), b.begin(), b.end(), out.begin());
std::set_union并集set_union(a.begin(),a.end(),b.begin(),b.end(),out.begin());
std::set_intersection交集set_intersection(a.begin(),a.end(),b.begin(),b.end(),out.begin());
std::set_difference差集set_difference(a.begin(),a.end(),b.begin(),b.end(),out.begin());
std::set_symmetric_difference对称差set_symmetric_difference(a.begin(),a.end(),b.begin(),b.end(),out.begin());

🔧 要求:参与集合算法的区间必须是 有序 的!

2.6 变换与生成算法

函数作用示例
std::for_each对每个元素执行函数for_each(v.begin(),v.end(),[](auto &x){x*=2;});
std::transform对区间应用函数并输出transform(a.begin(),a.end(),b.begin(),[](int x){return x*2;});
std::generate / std::generate_n按函数生成元素generate(v.begin(),v.end(),rand);
std::iota生成递增序列iota(v.begin(), v.end(), 1);

2.7 数值算法(来自 numeric)

函数作用示例
std::accumulate求和或任意二元操作int sum = accumulate(v.begin(),v.end(),0);
std::inner_product求向量内积auto dot = inner_product(a.begin(),a.end(),b.begin(),0);
std::partial_sum局部累加partial_sum(v.begin(),v.end(),out.begin());
std::iota生成递增序列std::iota(v.begin(), v.end(), 0);

3. C++ 示例代码

3.1 常用组合技巧

// 1. 删除满足条件的元素
v.erase(std::remove_if(v.begin(), v.end(), [](int x){return x<0;}), v.end());// 2. 查找并修改
auto it = std::find_if(v.begin(), v.end(), [](int x){return x>10;});
if (it != v.end()) *it = 10;// 3. 统计大于 5 的数量
int cnt = std::count_if(v.begin(), v.end(), [](int x){return x>5;});// 4. 判断是否有偶数
bool hasEven = std::any_of(v.begin(), v.end(), [](int x){return x%2==0;});

3.2 algorithm 中20个函数

直接复制到工程中运行的完整示例文件:

// File: algorithm_examples.cpp
#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>      // accumulate, iota
#include <random>       // shuffle
#include <iterator>     // ostream_iteratorusing namespace std;int main() {vector<int> v = {1, 2, 3, 4, 5, 3, 2, 1};cout << "原始数据: ";for (int x : v) cout << x << " ";cout << "\n\n";// 1. find - 查找指定值auto it = find(v.begin(), v.end(), 3);if (it != v.end()) cout << "find: 找到 3 在位置 " << distance(v.begin(), it) << "\n";// 2. find_if - 查找第一个满足条件的元素it = find_if(v.begin(), v.end(), [](int x){ return x > 3; });if (it != v.end()) cout << "find_if: 第一个 >3 的是 " << *it << "\n";// 3. any_of - 是否存在满足条件的元素cout << "any_of: 是否存在偶数? " << boolalpha<< any_of(v.begin(), v.end(), [](int x){ return x % 2 == 0; }) << "\n";// 4. all_of - 是否所有元素都满足条件cout << "all_of: 是否所有元素 >0? "<< all_of(v.begin(), v.end(), [](int x){ return x > 0; }) << "\n";// 5. none_of - 是否没有元素满足条件cout << "none_of: 是否所有元素都不是 10? "<< none_of(v.begin(), v.end(), [](int x){ return x == 10; }) << "\n";// 6. count - 统计指定值的数量cout << "count: 值为 3 的数量 = " << count(v.begin(), v.end(), 3) << "\n";// 7. count_if - 统计满足条件的数量cout << "count_if: 大于 2 的数量 = "<< count_if(v.begin(), v.end(), [](int x){ return x > 2; }) << "\n";// 8. sort - 升序排序sort(v.begin(), v.end());cout << "sort: ";for (int x : v) cout << x << " ";cout << "\n";// 9. reverse - 反转序列reverse(v.begin(), v.end());cout << "reverse: ";for (int x : v) cout << x << " ";cout << "\n";// 10. max_element / min_element - 最大/最小元素cout << "max_element: " << *max_element(v.begin(), v.end()) << "\n";cout << "min_element: " << *min_element(v.begin(), v.end()) << "\n";// 11. accumulate - 求和int sum = accumulate(v.begin(), v.end(), 0);cout << "accumulate: 总和 = " << sum << "\n";// 12. iota - 生成连续序列vector<int> seq(10);iota(seq.begin(), seq.end(), 1);cout << "iota: ";for (int x : seq) cout << x << " ";cout << "\n";// 13. unique - 删除连续重复元素(需先排序)sort(v.begin(), v.end());v.erase(unique(v.begin(), v.end()), v.end());cout << "unique: ";for (int x : v) cout << x << " ";cout << "\n";// 14. remove_if - 删除满足条件的元素vector<int> v2 = {1, 2, 3, 4, 5, 6};v2.erase(remove_if(v2.begin(), v2.end(), [](int x){ return x % 2 == 0; }), v2.end());cout << "remove_if: 删除偶数后 -> ";for (int x : v2) cout << x << " ";cout << "\n";// 15. replace_if - 替换满足条件的元素vector<int> v3 = {1, 2, 3, 4, 5};replace_if(v3.begin(), v3.end(), [](int x){ return x < 3; }, 0);cout << "replace_if: <3 的改为 0 -> ";for (int x : v3) cout << x << " ";cout << "\n";// 16. transform - 映射变换vector<int> v4(5);transform(v3.begin(), v3.end(), v4.begin(), [](int x){ return x * 2; });cout << "transform: 每个元素 *2 -> ";for (int x : v4) cout << x << " ";cout << "\n";// 17. for_each - 遍历操作cout << "for_each: 打印平方 -> ";for_each(v4.begin(), v4.end(), [](int x){ cout << x * x << " "; });cout << "\n";// 18. shuffle - 随机打乱shuffle(seq.begin(), seq.end(), mt19937{random_device{}()});cout << "shuffle: ";for (int x : seq) cout << x << " ";cout << "\n";// 19. merge - 合并两个已排序序列vector<int> a = {1, 3, 5};vector<int> b = {2, 4, 6};vector<int> merged;merge(a.begin(), a.end(), b.begin(), b.end(), back_inserter(merged));cout << "merge: ";for (int x : merged) cout << x << " ";cout << "\n";// 20. clamp - 限制值在区间内int x = 120;cout << "clamp: 限制 120 在 [0,100] -> " << clamp(x, 0, 100) << "\n";cout << "\n✅ 所有示例运行完毕。\n";return 0;
}
http://www.dtcms.com/a/521171.html

相关文章:

  • 中石化石油工程建设公司官方网站wordpress留言板页面怎么制作
  • 天津网站建设方案咨询动漫制作专业研究生考啥
  • FLUMINER福禄T3 115T:比特币挖矿的新选择,如何提升效率与稳定性?
  • html5手机网站适配电影网站带采集
  • 深圳品牌医疗网站建设医药电子商务网站建设
  • 备案域名指向一个网站保定网站设计公司
  • 麒麟信创系统安装pgsql-15.4 报错 popen failure: Cannot allocate memory
  • LeetCode 面试经典 150_链表_合并两个有序链表(58_21_C++_简单)
  • [优选算法专题四.前缀和——NO.31~32 连续数组、矩阵区域和]
  • 事业单位网站备案流程谷歌做不做网站
  • 做家居网站企业建设网站的目标
  • 福田网站改版安徽六安特产
  • XML 核心知识点
  • 图片类网站模板自己做网站是用什么软件
  • 全国通用工会考试真题及答案解析
  • 东莞寮步镇网站做网站需要自己研发吗
  • QLExpress 解析方程式
  • AI编程:结合MCP实现数据库连接与高效开发
  • 在线做网站有哪些平台wordpress二级
  • 怎样制作自己公司的网站企业在建设自己网站时
  • Flink DatastreamAPI详解(二)
  • 丢盖网logo设计免费官网合肥网站建设优化
  • Android View, SurfaceView, GLSurfaceView 的区别
  • 数据结构---优先级队列(堆)
  • PHP反序列化漏洞
  • dw做的网站怎么发布到网上wordpress wamp
  • 信用门户网站建设方案网站建设空间申请
  • RAG性能提升:从查询优化到范式演进的系统性路径
  • 响应式网站开发方法游戏官网平台
  • 网络管理员教程(初级)第六版--第4章 Web网站建设