C++提高程式設計 5 STL -常用演算法(拷貝替換演算法)
阿新 • • 發佈:2022-03-04
5.4 常用拷貝和替換演算法
演算法簡介:
copy //容器內指定範圍的元素拷貝到另一個容器中
replace //將容器內指定範圍的舊元素修改為新元素
replace_if //容器內指定範圍滿足條件的元素替換為新元素
swap //互換兩個容器的元素
5.4.1 copy //容器內指定範圍的元素拷貝到另一個容器中
函式原型:copy(iterator beg, iterator end,iterator dest);
//按值查詢元素,找到返回指定位置迭代器,找不到返回結束迭代器位置
#include<iostream> usingnamespace std; #include<vector> #include<algorithm> //常用拷貝和替換演算法 copy void print1(int val) { cout << val << " "; } void test1() { vector<int>v1; for (int i = 0; i < 10; i++) { v1.push_back(i); } vector<int>v2; v2.resize(v1.size()); copy(v1.begin(), v1.end(), v2.begin()); for_each(v2.begin(), v2.end(), print1);//0 1 2 3 4 5 6 7 8 9 cout << endl; } int main() { test1(); system("pause"); return 0; }
5.4.2 replace //將容器內指定範圍的舊元素修改為新元素
函式原型:replace(iterator beg, iterator end,oldvalue,newvalue);
//beg(end):開始(結束)迭代器 oldvalue(newvalue):舊(新)元素
#include<iostream> using namespacestd; #include<vector> #include<algorithm> //常用拷貝和替換演算法 replace //普通函式 //void print1(int val) //{ // cout << val << " "; //} //仿函式 class print1 { public: void operator()(int val) { cout << val << " "; } }; void test1() { vector<int>v1; v1.push_back(20); v1.push_back(10); v1.push_back(20); v1.push_back(30); v1.push_back(40); v1.push_back(50); v1.push_back(20); v1.push_back(50); v1.push_back(20); cout << "替換前:"; for_each(v1.begin(), v1.end(), print1()); //替換前:20 10 20 30 40 50 20 50 20 cout << endl; cout << "替換後:"; replace(v1.begin(), v1.end(), 20, 2000); for_each(v1.begin(), v1.end(), print1()); //替換後:2000 10 2000 30 40 50 2000 50 2000 cout << endl; } int main() { test1(); system("pause"); return 0; }
5.4.3replace_if //將區間內滿足條件的元素,替換為新元素
函式原型:replace_if(iterator beg, iterator end, _pred, newvalue);
//_pred 謂詞(返回bool型別) newvalue替換的新元素
#include<iostream> using namespace std; #include<vector> #include<algorithm> //常用拷貝和替換演算法 replace_if //普通函式 //void print1(int val) //{ // cout << val << " "; //} //仿函式 class print1 { public: void operator()(int val) { cout << val << " "; } }; class Greater { public: bool operator()(int val) { return val >= 30; } }; void test1() { vector<int>v1; v1.push_back(20); v1.push_back(10); v1.push_back(20); v1.push_back(30); v1.push_back(40); v1.push_back(50); v1.push_back(20); v1.push_back(50); v1.push_back(20); //將大於等於30的數 替換為3000 cout << "替換前:"; for_each(v1.begin(), v1.end(), print1()); //替換前:20 10 20 30 40 50 20 50 20 cout << endl; cout << "替換後:"; replace_if(v1.begin(), v1.end(), Greater(), 3000); for_each(v1.begin(), v1.end(), print1()); //替換後:20 10 20 3000 3000 3000 20 3000 20 cout << endl; } int main() { test1(); system("pause"); return 0; }
5.4.4 swap //互換兩個容器元素
函式原型:swap( container c1,container c2 ); //c1容器1,c2容器2 c1和c2應為同種型別容器
#include<iostream> using namespace std; #include<vector> #include<algorithm> //常用拷貝和替換演算法 swap //普通函式 void print1(int val) { cout << val << " "; } //仿函式 //class print1 //{ //public: // void operator()(int val) // { // cout << val << " "; // } //}; void test1() { vector<int>v1; vector<int>v2; for (int i = 0; i < 10; i++) { v1.push_back(i); } for (int j = 0; j < 5; j++) { v2.push_back(j); } cout << "交換前:" << endl; for_each(v1.begin(), v1.end(), print1); //0 1 2 3 4 5 6 7 8 9 cout << endl; for_each(v2.begin(), v2.end(), print1); //0 1 2 3 4 cout << endl; cout << "----------------------" << endl; cout << "交換後:" << endl; swap(v1, v2); for_each(v1.begin(), v1.end(), print1); //0 1 2 3 4 cout << endl; for_each(v2.begin(), v2.end(), print1); //0 1 2 3 4 5 6 7 8 9 cout << endl; } int main() { test1(); system("pause"); return 0; }