18.4.2【STL常用拷贝和替换算法replace、replace_if】
1 #include<iostream> 2 #include<cstdlib> 3 using namespace std; 4 #include<algorithm> 5 #include<vector> 6 7 8 /* 9 5.4.2 replace 10 将容器内指定范围的旧元素修改为新元素 11 replace(iterator beg, iterator end, oldvalue, newvalue); 12 // 将区间内旧元素 替换成 新元素 13 // beg 开始迭代器 14 // end 结束迭代器 15 // oldvalue 旧元素 16 // newvalue 新元素 17 replace会替换区间内满足条件的元素 18 19 5.4.3 replace_if 20 将区间内满足条件的元素,替换成指定元素 21 replace_if(iterator beg, iterator end, _pred, newvalue); 22 // 按条件替换元素,满足条件的替换成指定元素 23 // beg 开始迭代器 24 // end 结束迭代器 25 // _pred 谓词 26 // newvalue 替换的新元素 27 replace_if按条件查找,可以利用仿函数灵活筛选满足的条件 28 */ 29 30 31 void myprint(int val) 32 { 33 cout << val << " "; 34 } 35 36 class MyPrint 37 { 38 public: 39 void operator()(int val) 40 { 41 cout << val << " "; 42 } 43 }; 44 45 46 class Greater30 47 { 48 public: 49 bool operator()(int val) 50 { 51 return val >= 30; 52 } 53 }; 54 55 56 void test542() 57 { 58 vector<int> v; 59 v.push_back(10); 60 v.push_back(20); 61 v.push_back(30); 62 v.push_back(20); 63 v.push_back(40); 64 v.push_back(20); 65 v.push_back(30); 66 67 cout << "替换前:" << endl; 68 //for_each(v.begin(), v.end(), myprint); 69 for_each(v.begin(), v.end(), MyPrint()); //效果同上,回调函数用普通函数或仿函数(此处为匿名函数对象)皆可 70 cout << endl; 71 72 replace(v.begin(), v.end(), 20, 2000); 73 74 cout << "替换后:" << endl; 75 for_each(v.begin(), v.end(), myprint); 76 cout << endl; 77 } 78 79 80 void test543() 81 { 82 vector<int> v; 83 v.push_back(10); 84 v.push_back(20); 85 v.push_back(30); 86 v.push_back(20); 87 v.push_back(40); 88 v.push_back(20); 89 v.push_back(30); 90 91 cout << "替换前:" << endl; 92 for_each(v.begin(), v.end(), MyPrint()); 93 cout << endl; 94 95 replace_if(v.begin(), v.end(), Greater30(), 3000); 96 97 cout << "替换后:" << endl; 98 for_each(v.begin(), v.end(), myprint); 99 cout << endl; 100 } 101 102 103 int main() 104 { 105 test542(); 106 test543(); 107 108 system("pause"); 109 return 0; 110 }