1.概述
- 算法主要由头文件组成
- 是所有STL头文件中最大的一个,范围涉及到比较,交换,查找,遍历操作,复制,修改等等
- 体积很小,只包括几个在序列上面进行简单数学运算的模板函数
- 定义了一些模板类,用以声明函数对象
2.常用遍历算法
- for_each //遍历容器
- transform //搬运容器到另一个容器中
3.
一、std::for_each
作用:遍历容器,对每个元素「做某事」,一般不修改原值(也可以改)
头文件:
cpp
#include <algorithm>
#include <vector>
#include <iostream>
极简例子:打印每个数字
cpp
#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;
int main() {
vector<int> v = {1, 2, 3, 4};
// 对每个元素,执行后面的 lambda
for_each(v.begin(), v.end(), [](int x) {
cout << x << " "; // 只是打印,不修改
});
return 0;
}
你可以理解成:
「对每一个元素,都干这件事」
输出:
plaintext
1 2 3 4
二、std::transform(iterator beg1,iterator end1,iterator beg2, _func) //beg1 源容器开始迭代器 //end1 源容器结束迭代器 //beg2 目标容器开始迭代器 //_func 函数或者函数对象
作用:把每个元素「加工一下」,生成新容器 / 覆盖原容器
例子:每个数字 ×2,放到新容器
cpp
#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;
int main() {
vector<int> v1 = {1, 2, 3, 4};
vector<int> v2(v1.size()); // 用来存结果
// 把 v1 每个元素处理后,放进 v2
transform(v1.begin(), v1.end(),
v2.begin(),
[](int x) {
return x * 2; // 加工规则
});
for (int x : v2) cout << x << " ";
return 0;
}
输出:
plaintext
2 4 6 8
你可以理解成:
「把每个元素变形,得到新的一批元素」
一句话分清
- for_each:遍历 + 做事(打印、统计、修改等),不返回新容器
- transform:遍历 + 转换,一定会产生新结果