C++ STL 系列(五):STL 算法库(algorithm)—— 常用算法详解
在前一篇文章中我们介绍了Iterator迭代器。迭代器的作用是为 STL 提供一种统一访问容器元素的方式。有了迭代器之后STL 就可以提供一套通用算法库。这就是algorithmSTL 中的大部分算法都定义在这个头文件中。一、什么是 STL 算法库STL 算法库是一组通用算法函数。这些算法可以直接作用于容器例如排序 查找 统计 反转 遍历示例#include algorithm #include vector #include iostream using namespace std; int main() { vectorint nums {3,1,2}; sort(nums.begin(), nums.end()); for(int n : nums) { cout n endl; } }输出1 2 3二、为什么 STL 要单独设计算法库STL 的设计思想是算法与数据结构分离也就是说容器负责存储数据 算法负责处理数据例如vectorint v; sort(v.begin(), v.end());这里组件作用vector容器iterator数据访问sort算法算法并不依赖容器类型只需要iterator。因此sort 可以用于 vector、deque、array 等容器三、最常用的 STL 算法STL 提供了很多算法但常用的主要有以下几个。1 sort排序sort(begin, end);示例vectorint nums {5,2,8,1}; sort(nums.begin(), nums.end());结果1 2 5 8如果需要降序sort(nums.begin(), nums.end(), greaterint());2 find查找元素find(begin, end, value);示例auto it find(nums.begin(), nums.end(), 5);如果找到it ! nums.end()3 count统计元素个数count(begin, end, value);示例int c count(nums.begin(), nums.end(), 2);4 reverse反转reverse(begin, end);示例reverse(nums.begin(), nums.end());5 for_each遍历for_each(begin, end, function);示例for_each(nums.begin(), nums.end(), [](int x){ cout x endl; });四、算法的核心特点STL 算法有几个重要特点1 通用性强 2 不依赖具体容器 3 通过 iterator 操作数据因此 STL 的整体结构是容器 → iterator → algorithm五、STL 算法使用模式大多数 STL 算法使用方式类似algorithm(container.begin(), container.end());例如sort(v.begin(), v.end()); find(v.begin(), v.end(), 10); count(v.begin(), v.end(), 5);这种写法在 STL 中非常常见。六、工程中的常见使用场景STL 算法在实际开发中非常常见例如数据排序 数据查找 统计数据 反转数据 遍历数据例如vectorint nums {7,3,5,1}; sort(nums.begin(), nums.end());排序之后1 3 5 7七、总结STL 算法库提供了一组通用算法函数。核心特点算法与容器解耦也就是说算法只依赖 iterator不依赖容器类型常用算法包括sort find count reverse for_each下一篇下一篇我们将继续介绍STL 容器全景vector / list / deque / set