0 STL算法
STL算法主要由<algorithm>
<functional>
<numeric>
等头文件组成。
<algorithm>
:包括遍历、查找、排序、比较、交换、复制、修改等操作的函数模板。
<functional>
:包括函数对象/仿函数相关的类模板。
<numeric>
:体积较小,仅包括简单数学运算相关的函数模板。
1 常用遍历算法简介【for_each、transform】
算法简介:
for_each
:遍历容器元素及统一逻辑处理。
transform
:将源容器的元素全部拷贝至目标容器。
2 for_each【遍历容器元素及统一逻辑处理】
作用:遍历容器元素及统一逻辑处理。
注:使用
for_each
算法时,需包含头文件include <algorithm>
。
函数原型:
for_each(iterator begin, iterator end, _func);
参数解释:
begin
:迭代器起始位置;
end
:迭代器结束位置;
_func
:对当前所遍历的容器元素的处理。
①普通回调函数;
②函数对象/仿函数;
③匿名函数(lambda表达式)。
示例:
#include <iostream>
using namespace std;
#include <vector>
#include <algorithm> //使用for_each算法
//普通回调函数
void print(int val) {
cout << val << " ";
}
//函数对象/仿函数
class Printer{
public:
void operator()(int val) {
cout << val << " ";
}
};
int main() {
vector<int> v;
v.push_back(9);
v.push_back(1);
v.push_back(7);
v.push_back(6);
v.push_back(3);
/* 遍历容器元素 */
//1.for_each算法 + 普通回调函数————传递函数名
for_each(v.begin(), v.end(), print); //9 1 7 6 3
//2.for_each算法 + 函数对象/仿函数————传递匿名函数对象
for_each(v.begin(), v.end(), Printer()); //9 1 7 6 3
//3.for_each算法 + 匿名函数(lambda表达式)
for_each(v.begin(), v.end(), [](int val) {cout << val << " "; }); //9 1 7 6 3
/* 对容器元素的统一逻辑处理 */
//全部容器元素的值减1后输出
for_each(v.begin(), v.end(), [](int val) {cout << val - 1 << " "; }); //8 0 6 5 2
return 0;
}
3 transform【将源容器的元素全部拷贝至目标容器】
作用:将源容器的元素全部拷贝至目标容器。
注1:使用
transform
算法时,需包含头文件include <algorithm>
。
注2:使用transform
算法时,需为目标容器提前开辟内存空间,如dest.resize(src.size());
,否则程序运行时崩溃。
函数原型:
transform(iterator begin1, iterator end1, iterator begin2, _func);
参数解释:
begin1
:源容器迭代器起始位置;
end1
:源容器迭代器结束位置;
begin2
:目标容器迭代器起始位置;
_func
:对当前遍历容器元素的逻辑运算处理。
①普通回调函数;
②函数对象/仿函数;
③匿名函数(lambda表达式)。
示例:
#include <iostream>
using namespace std;
#include <vector>
#include <algorithm> //使用transform算法
//普通回调函数
int print(int val) {
//元素值加10
return val + 10;
}
//函数对象/仿函数
class Printer {
public:
int operator()(int val) {
//直接返回元素
return val;
}
};
int main() {
vector<int> src;
for(int i = 0; i < 5; i++){
src.push_back(i);
}
/* 拷贝容器的全部元素,必须为目标容器提前开辟内存空间 */
vector<int> dest;
dest.resize(src.size());
//1.transform算法 + 普通回调函数————传递函数名
transform(src.begin(), src.end(), dest.begin(), print);
for_each(dest.begin(), dest.end(), [](int val) {cout << val << " "; }); //10 11 12 13 14
//2.transform算法 + 函数对象/仿函数————传递匿名函数对象
transform(src.begin(), src.end(), dest.begin(), Printer());
for_each(dest.begin(), dest.end(), [](int val) {cout << val << " "; }); //0 1 2 3 4
//3.transform算法 + 匿名函数(lambda表达式)
transform(src.begin(), src.end(), dest.begin(), [](int val) {return val + 20; });
for_each(dest.begin(), dest.end(), [](int val) {cout << val << " "; }); //20 21 22 23 24
return 0;
}