SLT的算法主要放在三个头文件里面:<algorithm>、<functional>和<numeric>
- <algorithm>是所有STL头文件里面最大的一个,范围涉及到比较、交换、查找、遍历、赋值,复制、修改等等。
- <numeric>的体积较小,包含几个在序列上面进行简单的数学运算的模板函数。
- <functional> 定义了一些用于声明函数对象的类模板。
常用遍历算法
-
for_each
//遍历容器 -
transform
//搬运到另一个容器
for_each
for_each(iterator bagin,iterator end,_func);
_func表示函数,或者函数对象
//普通函数输出
void print(int val)
{
cout << val << " ";
}
//仿函数输出
class Print
{
public:
void operator()(int val)
{
cout << val << " ";
}
};
void test01()
{
vector<int>v;
for (int i = 0; i < 10; i++)
{
v.push_back(i + 1);
}
cout << "普通函数输出:" << endl;
for_each(v.begin(), v.end(), print); //最后一个参数是一个函数名
cout << "仿函数输出:" << endl;
cout << endl;
for_each(v.begin(), v.end(), Print()); //最后一个参数是函数对象,这里写了一个匿名对象
}
transform
transform(iterator begin1,iterator end1, iterator begin2,_func);
begin1 、end1---原容器的起始迭代器、结束迭代器
begin2 --- 目标容器的起始迭代器
_func 函数或者函数对象
void print(int val)
{
cout << val << " ";
}
class Transform
{
public:
int operator()(int val)
{
return val;
}
};
void test01()
{
vector<int>v;
for (int i = 0; i < 10; i++)
{
v.push_back(i + 1);
}
vector<int> vTarget;
vTarget.resize(v.size()); //需要重新指定大小
transform(v.begin(), v.end(), vTarget.begin(), Transform());
for_each(v.begin(), v.end(), print); //1 2 3 4 5 6 7 8 9 10
}
transform算法里面的最后一个参数是用来在转运的时候进行一些运算的,比如所有数据都+100,所有数据取反等等。本例中没有进行这样的操作,直接原值返回,也就是不做任何运算,原样复制到目标容器中去。