变易算法
C++ STL 的变易算法 (Mutating algorithms) 是一组能够修改容器元素数据的模板函数,可进行序列数据的复制、交换、替换、填充、移除、旋转、随机抖动和分割。这些算法对迭代器有较高的要求,具体的迭代器类型随各个算法而定,或前向迭代器、或双向迭代器、又或者是随机迭代器,以提供算法所需要的迭代器操作。应用变易算法时,先要检查容器的迭代器是否符合要求,防止产生编译错误。
目录:
1 /* 下面示例程序将向量{1 3 5},拷贝到链表{2 4 6 8 10}的首元素开始位置,结果链表的前3个元素被拷贝覆盖掉,打印输出为“1 3 5 8 10” 2 */ 3 ----------------------------------------------- 应用 copy 算法复制向量vector元素链表到链表 list 4 #include5 #include 6 #include 7 #include
8 using namespace std; 9 10 void print(int x)11 {12 cout << x << " ";13 }14 15 int main()16 {17 // 初始化向量v18 vector v;19 v.push_back(1);20 v.push_back(3);21 v.push_back(5);22 23 // 初始化双向链表l24 list l;25 l.push_back(2);26 l.push_back(4);27 l.push_back(6);28 l.push_back(8);29 l.push_back(10);30 31 // 复制v到l32 copy(v.begin(), v.end(), l.begin());33 34 // 打印链表l中的元素35 for_each(l.begin(), l.end(), print);36 cout << endl;37 38 return 0;39 }
1 /* 下面示例程序将{1 2 3 4 5 6 7 8 9 10}向量的前3个元素复制到后面3个元素中,打印输出为“1 2 3 4 5 6 7 1 2 3 ”,与采用 copy 算法复制的打印输出完全相同,只是元素的复制顺序不同 2 */ 3 ----------------------------------------------- 应用 copy_backward 算法在同一个向量vector中进行复制 4 #include5 #include 6 #include 7 using namespace std; 8 9 void print(int x)10 {11 cout << x << ' ';12 }13 14 int main()15 {16 vector v(10);17 // 初始化复制18 for (unsigned int i=0; i
1 /* 下面示例程序将整数 a=5 和 b=26 交换,结果当然为 a=26 和 b=5 2 */ 3 ----------------------------------------------- 应用 swap 算法交换两个整型变量 4 #include5 #include 6 using namespace std; 7 int main() 8 { 9 int a = 5;10 int b = 26;11 cout << "交换前" << "a = " << a << " b = " << b << endl << endl;12 // 交换13 swap(a,b);14 cout << "交换后" << "a = " << a << " b = " << b << endl;15 16 return 0;17 }
1 /* 下面示例程序简单地讲标准整数类型的 a 和 b,调用 iter_swap 算法进行交换 2 */ 3 ----------------------------------------------- 4 #include5 #include 6 using namespace std; 7 int main() 8 { 9 int a = 5;10 int b = 6;11 cout << "交换前 a=" << a << ", b=" << b << endl << endl;12 // 交换13 iter_swap(&a, &b);14 cout << "交换后 a=" << a << ", b=" << b << endl << endl;15 16 return 0;17 }
1 /* 下面示例程序将两个向量容器 v1 和 v2 的元素交换,打印输出为“交换前,v1=1 3 5 v2=2 4 6交换后,v1=2 4 6 v2=1 3 5” 2 */ 3 ----------------------------------------------- 应用 swap_ranges 算法交换两个 vector 容器元素 4 #include5 #include 6 #include 7 using namespace std; 8 9 void print(int x)10 {11 cout << x << " ";12 }13 14 int main()15 {16 vector v1, v2;17 v1.push_back(1);18 v1.push_back(3);19 v1.push_back(5);20 v2.push_back(2);21 v2.push_back(4);22 v2.push_back(6);23 24 // 打印v1, v225 cout << "交换前, v1= ";26 for_each(v1.begin(), v1.end(), print);27 cout << endl;28 29 cout << "交换前, v2= ";30 for_each(v2.begin(), v2.end(), print);31 cout << endl;32 33 // 交换 v1, v234 swap_ranges(v1.begin(), v1.end(), v2.begin());35 36 // 打印 v1, v237 cout << endl;38 cout << "交换后, v1= ";39 for_each(v1.begin(), v1.end(), print);40 cout << endl;41 42 cout << "交换后, v2= ";43 for_each(v2.begin(), v2.end(), print);44 cout << endl;45 46 return 0;47 }
1 /* 下面示例程序将向量 v 的元素 5、15和25,执行平方变换,结果放入双向链表l 中,打印输出为“25 225 625” 2 */ 3 ----------------------------------------------- 应用 transform 算法对 vector 容器元素进行平方计算 4 #include5 #include 6 #include 7 #include
8 using namespace std; 9 10 int square(int x)11 {12 return x*x;13 }14 15 void print(int x)16 {17 cout << x << " ";18 }19 20 int main()21 {22 // vector 初始化23 vector v;24 v.push_back(5);25 v.push_back(15);26 v.push_back(25);27 28 // list 初始化29 list l(3);30 31 // 对vector容器元素执行平方运算,放入 list 容器32 transform(v.begin(), v.end(), l.begin(), square);33 34 // 打印链表元素35 for_each(l.begin(), l.end(), print);36 cout << endl;37 38 return 0;39 }
1 /* 下面示例程序先将变量 v={13, 25, 27, 25, 29} 的元素25替换为 100,然后,再将数组 iArray[]={3, 6, 5, 9, 5, 5, 10}的元素5替换为200,打印"v向量元素:13 100 27 100 29 数组iArray元素:3 6 200 9 200 200 10" 2 */ 3 ----------------------------------------------- 应用 replace 算法替换向量和数组元素 4 #include5 #include 6 #include 7 using namespace std; 8 9 void print(int x)10 {11 cout << x << " ";12 }13 14 int main()15 {16 vector v;17 v.push_back(13);18 v.push_back(25);19 v.push_back(27);20 v.push_back(25);21 v.push_back(29);22 23 // 将v的25全部替换为10024 replace(v.begin(), v.end(), 25, 100);25 cout << "v向量元素:";26 for_each(v.begin(), v.end(), print);27 cout << endl;28 29 // 将iArray的5全部替换为20030 int iArray[7] = { 3, 6, 5, 9, 5, 5, 10};31 replace(iArray, iArray+7, 5, 200);32 cout << "数组iArray元素:";33 for_each(iArray, iArray+7, print);34 cout << endl;35 36 return 0;37 }
1 /* 下面示例程序将向量 v={0, 1, 2, 3, 4, 5, 6, 0, 1, 2}的奇数元素替换为新值38,打印输出为“0 38 2 38 4 38 6 0 38 2” 2 */ 3 ----------------------------------------------- 应用 replace_if 算法替换向量中奇数值的元素 4 #include5 #include 6 #include 7 using namespace std; 8 9 bool odd(int x)10 {11 return x % 2;12 }13 14 int main()15 {16 vector v(10);17 unsigned int i;18 for (i=0; i
1 /* 下面的示例程序将链表l1={1, 3, 1, 6, 8}中值为1 的元素替换为100后,拷贝到链表l2中。打印输出为“l1保持不变:1 3 1 6 8 l2元素为:100 3 100 6 8” 2 */ 3 ----------------------------------------------- 应用 replace_copy 算法将值为1的元素替换后拷贝到新容器 4 #include5 #include 6 #include
7 using namespace std; 8 9 void print(int x)10 {11 cout << x << " ";12 }13 14 int main()15 {16 list l1;17 l1.push_back(1);18 l1.push_back(3);19 l1.push_back(1);20 l1.push_back(6);21 l1.push_back(8);22 23 // 将l1链表元素1替换为 100,然后拷贝到l2链表24 list l2(5);25 replace_copy(l1.begin(), l1.end(), l2.begin(), 1, 100);26 cout << "l1 保持不变:";27 for_each(l1.begin(), l1.end(), print);28 cout << endl;29 cout << "l2 元素为:";30 for_each(l2.begin(), l2.end(), print);31 cout << endl;32 33 return 0;34 }
1 /* 下面示例程序将向量 v={0, 1, 2, 3, 4, 5, 6, 0, 1, 2}中奇数值元素替换为38,然后拷贝到链表l中,链表的打印输出为“0 38 2 38 4 38 6 0 38 2”,向量v的元素不变 2 */ 3 ----------------------------------------------- 应用 replace_copy_if 算法将奇数元素替换后拷贝到新容器 4 #include5 #include 6 #include 7 #include
8 using namespace std; 9 10 bool odd(int x)11 {12 return x % 2;13 }14 15 int main()16 {17 vector v(10);18 unsigned int i;19 for (i=0; i