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

C++ STL算法

STL算法是C++标准库中一组高度优化的通用算法,主要定义在<algorithm><numeric><functional>头文件中。它们通过迭代器抽象与容器交互,提供丰富的操作功能。

一、STL算法基础架构

1. 设计哲学

  • 泛型编程:通过模板实现类型无关

  • 迭代器抽象:统一访问容器元素的方式

  • 函数对象:支持自定义操作逻辑

2. 核心组件

// 典型算法签名
template <class InputIt, class UnaryPredicate>
InputIt find_if(InputIt first, InputIt last, UnaryPredicate p);
  • InputIt:输入迭代器类型

  • first/last:定义元素范围[first, last)

  • UnaryPredicate:一元谓词(函数对象)

二、算法分类详解

1. 非修改序列算法(只读)

算法功能描述复杂度
all_of检查所有元素是否满足条件O(n)
any_of检查至少一个元素满足条件O(n)
none_of检查没有元素满足条件O(n)
find查找特定值O(n)
find_if查找满足条件的元素O(n)
count统计值出现次数O(n)
mismatch找出两个序列第一个不同点O(n)
equal比较两个序列是否相等O(n)

示例

std::vector<int> v{1,2,3,4,5};
bool all_even = std::all_of(v.begin(), v.end(), [](int i){ return i%2==0; });
auto it = std::find(v.begin(), v.end(), 3);
size_t cnt = std::count(v.begin(), v.end(), 2);

2. 修改序列算法

算法功能描述复杂度
copy复制元素到新位置O(n)
move移动元素(C++11)O(n)
fill填充元素O(n)
replace替换特定值O(n)
remove"删除"特定值(实际是移动)O(n)
reverse反转元素顺序O(n)
rotate旋转元素位置O(n)
unique去除相邻重复元素O(n)

示例

std::vector<int> src{1,2,3}, dest(3);
std::copy(src.begin(), src.end(), dest.begin());std::string s = "Hello";
std::reverse(s.begin(), s.end());  // s = "olleH"std::vector<int> v{1,2,2,3,2,4};
auto last = std::remove(v.begin(), v.end(), 2);
v.erase(last, v.end());  // v = {1,3,4}

3. 排序与相关算法

算法功能描述复杂度
sort快速排序O(n log n)
stable_sort稳定排序(保持相等元素顺序)O(n log n)
partial_sort部分排序(前N个元素)O(n log k)
nth_element找出第n小的元素O(n)
is_sorted检查是否已排序O(n)
merge合并两个有序序列O(n+m)
binary_search二分查找O(log n)

示例

std::vector<int> v{5,3,1,4,2};
std::sort(v.begin(), v.end());  // {1,2,3,4,5}// 只排序前3个元素
std::partial_sort(v.begin(), v.begin()+3, v.end());// 找出中位数
auto mid = v.begin() + v.size()/2;
std::nth_element(v.begin(), mid, v.end());
int median = *mid;

4. 数值算法(<numeric>)

算法功能描述
accumulate累加/自定义归约操作
inner_product计算内积
partial_sum计算部分和
adjacent_difference计算相邻差
iota填充递增序列

示例

std::vector<int> v{1,2,3,4,5};
int sum = std::accumulate(v.begin(), v.end(), 0);
int product = std::accumulate(v.begin(), v.end(), 1, [](int a, int b){ return a*b; });std::vector<int> prefix;
std::partial_sum(v.begin(), v.end(), std::back_inserter(prefix));
// prefix = {1,3,6,10,15}

三、高级用法与技巧

1. 迭代器适配器

#include <iterator>// 反向迭代
std::sort(v.rbegin(), v.rend());// 插入迭代器
std::fill_n(std::back_inserter(v), 5, 42);// 流迭代器
std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " "));

2. 谓词组合

#include <functional>auto is_even = [](int x){ return x%2==0; };
auto is_positive = [](int x){ return x>0; };// 组合谓词
auto is_even_positive = [&](int x){return is_even(x) && is_positive(x);
};std::find_if(v.begin(), v.end(), is_even_positive);

3. 执行策略(C++17)

#include <execution>// 并行排序
std::sort(std::execution::par, v.begin(), v.end());// 并行变换
std::transform(std::execution::par,v.begin(), v.end(), v.begin(),[](int x){ return x*2; });

四、性能优化指南

  1. 减少数据拷贝

    // 不好
    std::vector<int> copy = original;
    std::sort(copy.begin(), copy.end());// 好(原地排序)
    std::sort(original.begin(), original.end());

  2. 预分配内存

    std::vector<int> result;
    result.reserve(input.size());  // 避免多次扩容
    std::copy_if(input.begin(), input.end(), std::back_inserter(result), predicate);

  3. 选择合适算法

    • 小数据量:std::sort可能优于std::stable_sort

    • 部分排序:优先std::partial_sortstd::nth_element

http://www.xdnf.cn/news/15360.html

相关文章:

  • C++_编程提升_temaplate模板_案例
  • 传统机器学习在信用卡交易预测中的卓越表现:从R²=-0.0075到1.0000的华丽转身
  • 复习笔记 38
  • vue3+arcgisAPI4示例:自定义多个气泡窗口展示(附源码下载)
  • (三)OpenCV——图像形态学
  • 第8天:LSTM模型预测糖尿病(优化)
  • 2025年采购管理系统深度测评
  • 小架构step系列14:白盒集成测试原理
  • 北京饮马河科技公司 Java 实习面经
  • DeepSeek 本地部署
  • LeetCode经典题解:206、两数之和(Two Sum)
  • 面向对象的设计模式
  • Vue+axios
  • XML vs JSON:核心区别与最佳选择
  • 前端常见十大问题讲解
  • 基于esp32系列的开源无线dap-link项目使用介绍
  • 机器人形态的几点讨论
  • GNhao,长期使用跨境手机SIM卡成为新趋势!
  • hive的相关的优化
  • flink 中配置hadoop 遇到问题解决
  • C++类与对象(上)
  • Kubernetes Ingress:实现HTTPHTTPS流量管理
  • 多客户端 - 服务器结构-实操
  • apt-get update失败解决办法
  • 15.Python 列表元素的偏移
  • k8s-高级调度(二)
  • 构建完整工具链:GCC/G++ + Makefile + Git 自动化开发流程
  • 【安卓笔记】线程基本使用:锁、锁案例
  • 学习开发之无参与有参
  • 【操作系统】strace 跟踪系统调用(一)