1 #include<iostream>
2 #include<cstdlib>
3 using namespace std;
4 #include<vector>
5 #include<algorithm>
6
7
8 /*
9 5 STL常用算法
10
11 算法主要是由头文件<algorithm> <functional> <numeric> 组成。
12
13 <algorithm> 是所有STL头文件中最大的一个,范围涉及到比较、 交换、查找、遍历操作、复制、修改等等
14 <numeric> 体积很小,只包括几个在序列上面进行简单数学运算的模板函数
15 <functional> 定义了一些模板类,用以声明函数对象。
16
17 5.1 常用遍历算法
18
19 5.1.1 for_each //遍历容器
20
21 for_each(iterator beg, iterator end, _func);
22
23 // 遍历算法 遍历容器元素
24 // beg 开始迭代器
25 // end 结束迭代器
26 // _func 函数或者函数对象(回调函数)
27
28 for_each在实际开发中是最常用遍历算法,需要熟练掌握
29
30 5.1.2 transform //搬运容器到另一个容器中
31
32 transform(iterator beg1, iterator end1, iterator beg2, _func);
33
34 //beg1 源容器开始迭代器
35 //end1 源容器结束迭代器
36 //beg2 目标容器开始迭代器
37 //_func 函数或者函数对象
38
39 搬运的目标容器必须要提前开辟空间,否则无法正常搬运
40 */
41
42
43 void print1(int val)
44 {
45 cout << val << " ";
46 }
47
48
49 class Print2
50 {
51 public:
52 void operator()(int val)
53 {
54 cout << val << " ";
55 }
56 };
57
58
59 void test511()
60 {
61 vector<int> v;
62 for(int i=0; i<10; i++)
63 {
64 v.push_back(i);
65 }
66
67 for_each(v.begin(), v.end(), print1); //普通函数
68 cout << endl;
69
70 for_each(v.begin(), v.end(), Print2()); //仿函数,匿名函数对象
71 cout << endl;
72 }
73
74
75 class MyTransform
76 {
77 public:
78 int operator()(int val)
79 {
80 return val + 1000; //可在此处进行过逻辑运算等
81 }
82 };
83
84
85 void test512()
86 {
87 vector<int> v; //源容器
88 for(int i=0; i<10; i++)
89 {
90 v.push_back(i);
91 }
92
93 vector<int> v_target; //目标容器
94 v_target.resize(v.size()); //目标容器需要提前开辟空间,否则报错
95
96 transform(v.begin(), v.end(), v_target.begin(), MyTransform());
97
98 for_each(v_target.begin(), v_target.end(), Print2());
99 cout << endl;
100 }
101
102
103 int main()
104 {
105 test511();
106 test512();
107
108 system("pause");
109 return 0;
110 }
