18.1【STL常用遍历算法】
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 }