一、STL
算法概述
- 算法主要包含在头文件
<algorithm>
<functional>
<numeric>
中 <algorithm>
是所有STL头文件中最大的,涉及到:遍历、比较、 查找、交换、复制、修改等操作<functional>
定义了一些模板类,用来声明函数对象<numeric>
最小,只包含几个在序列上进行简单数学运算的模板函数
算法分为:质变算法和非质变算法
- 质变算法:运算过程中会更改区间内的元素的内容。例如拷贝,替换,删除等
- 非质变算法:运算过程中不会更改区间内的元素内容,例如查找、计数、遍历、寻找极值等
二、for_each
功能: 遍历容器中所有元素
for_each()
算法非常灵活,允许以不同的方式访问、处理、修改每一个元素。因此,for_each()
既属于质变算法,也属于非质变算法。
函数原型: | for_each(iterator beg, iterator end, func) | 解释 |
---|---|---|
参数1 | iterator beg | 开始迭代器 |
参数2 | iterator end | 结束迭代器 |
参数3 | func | 函数或者函数对象 |
实现:
//for_each()的实现如下
template <typename Iterator, typename Operation>
Operation for_each (Iterator beg, Iterator end, Operation op)
{
while(beg != end)
{
op(*beg);
++beg;
}
return op;
}
示例:
#include <iostream>
#include <algorithm> //必须包含该头文件
#include <vector>
using namespace std;
//普通函数
void printA(int value)
{
cout << value << " ";
}
//函数对象(仿函数)
class printB
{
public:
void operator()(int value)
{
cout << value << " ";
}
};
class printC
{
public:
void operator()(int& value)
{
value = value + 1; //修改入参的值
cout << value << " ";
}
};
void test01()
{
vector<int> vec;
for (int i = 0; i < 10; i++)
{
vec.push_back(i);
}
//普通函数遍历算法
cout << "for_each printA:";
for_each(vec.begin(), vec.end(), printA);
cout << endl;
//函数对象(仿函数)遍历算法-非质变算法
cout << "for_each printB():";
for_each(vec.begin(), vec.end(), printB());
cout << endl;
//函数对象(仿函数)遍历算法-质变算法
cout << "for_each printC():";
for_each(vec.begin(), vec.end(), printC());
cout << endl;
}
int main()
{
test01();
system("pause");
return 0;
}
//result
for_each printA:0 1 2 3 4 5 6 7 8 9
for_each printB():0 1 2 3 4 5 6 7 8 9
for_each printC():1 2 3 4 5 6 7 8 9 10
注:自C++11起,range-based for循环
提供了更方便、更自然的遍历方法。因此,for_each()
算法其重要性可能会逐渐降低。