当前位置:   article > 正文

C++之STL(六&七)

C++之STL(六&七)

1、变动性算法

  1. #include <vector>
  2. #include <iostream>
  3. #include <list>
  4. #include <algorithm>
  5. using namespace std;
  6. void print_element(int n)
  7. {
  8. cout << n << ' ';
  9. }
  10. void add_3(int& n)
  11. {
  12. n = n + 3;
  13. }
  14. int fun(int n)
  15. {
  16. return 2 * n;
  17. }
  18. bool func(int n)
  19. {
  20. return n < 10;
  21. }
  22. int main() {
  23. int a[] = {1, 2, 3, 4, 5};
  24. vector<int> v(a, a+5);
  25. // 这个for_each会不会改动到原数据取决于你在函数中怎么实现,因为源码中返回的是一个reference引用
  26. for_each(v.begin(), v.end(), print_element);
  27. cout << endl;
  28. for_each(v.begin(), v.end(), add_3);
  29. for_each(v.begin(), v.end(), print_element);
  30. cout << endl;
  31. list<int> l(15);
  32. for_each(l.begin(), l.end(), print_element);
  33. cout << endl;
  34. // copy其实就是for循环从begin到end,然后将里面的值赋值给第三个参数
  35. // 注意:第三个参数的空间必须是已经存在的,copy不会再分配空间
  36. copy(v.begin(), v.end(), l.begin());
  37. for_each(l.begin(), l.end(), print_element);
  38. cout << endl;
  39. // 从末尾开始拷贝
  40. copy_backward(v.begin(), v.end(), l.end());
  41. for_each(l.begin(), l.end(), print_element);
  42. cout << endl;
  43. list<int> l2(5);
  44. transform(v.begin(), v.end(), l2.begin(), fun);
  45. for_each(l2.begin(), l2.end(), print_element);
  46. cout << endl;
  47. // 替换
  48. vector<int> v2(a, a+5);
  49. replace(v2.begin(), v2.end(), 3, 13);
  50. for_each(v2.begin(), v2.end(), print_element);
  51. cout << endl;
  52. // 在拷贝的过程中替换(原数据不变,目标改变)
  53. vector<int> v3(a, a+5);
  54. list<int> l3(5);
  55. replace_copy(v3.begin(), v3.end(), l3.begin(), 13, 3);
  56. for_each(v3.begin(), v3.end(), print_element);
  57. cout << endl;
  58. for_each(l3.begin(), l3.end(), print_element);
  59. cout << endl;
  60. // 在拷贝的过程中执行某个动作
  61. replace_copy_if(v.begin(), v.end(), l3.begin(), func, 0);
  62. for_each(l3.begin(), l3.end(), print_element);
  63. cout << endl;
  64. return 0;
  65. }
  66. // 输出
  67. 1 2 3 4 5
  68. 4 5 6 7 8
  69. 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  70. 4 5 6 7 8 0 0 0 0 0 0 0 0 0 0
  71. 4 5 6 7 8 0 0 0 0 0 4 5 6 7 8
  72. 8 10 12 14 16
  73. 1 2 13 4 5
  74. 1 2 3 4 5
  75. 1 2 3 4 5
  76. 0 0 0 0 0

2、其他算法

  1. #include <iostream>
  2. using namespace std;
  3. #include <algorithm>
  4. #include <vector>
  5. #include <numeric>
  6. void print_element(int n)
  7. {
  8. cout << n << ' ';
  9. }
  10. int mult(int a, int b)
  11. {
  12. return a * b;
  13. }
  14. int main() {
  15. int a[] = {1, 3, 7,2, 3, 4, 5, 6, 7};
  16. vector<int> v(a, a + 9);
  17. for_each(v.begin(), v.end(), print_element);
  18. cout << endl;
  19. // 移除值为3
  20. // 首先查找给定第一个位置,然后遍历后面的元素,如果遇到要删除的元素,删除该元素
  21. // 然后将非删除的元素拷贝到前面,覆盖到前面的元素
  22. remove(v.begin(), v.end(), 3);
  23. for_each(v.begin(), v.end(), print_element);
  24. cout << endl;
  25. //如果要把里面的值删除
  26. int b[] = {1, 3, 7,2, 3, 4, 5, 6, 7};
  27. vector<int> v1(b, b + 9);
  28. v1.erase(remove(v1.begin(), v1.end(), 3), v1.end());
  29. for_each(v1.begin(), v1.end(), print_element);
  30. cout << endl;
  31. int c[] = {1, 2, 3, 4, 5, 6};
  32. vector<int> v2(c, c + 6);
  33. rotate(v2.begin(), v2.begin() + 2, v2.end());
  34. for_each(v2.begin(), v2.end(), print_element);
  35. cout << endl;
  36. // 排序
  37. sort(v2.begin(), v2.end());
  38. for_each(v2.begin(), v2.end(), print_element);
  39. cout << endl;
  40. // 已序区间排序
  41. int d[] = {1, 10, 10, 14, 15, 16};
  42. vector <int> v3(d, d + 6);
  43. vector<int>::iterator it;
  44. it = lower_bound(v3.begin(), v3.end(), 10);
  45. if(it != v3.end())
  46. {
  47. cout << it - v3.begin() << endl;
  48. }
  49. it = upper_bound(v3.begin(), v3.end(), 10);
  50. if(it != v3.end())
  51. {
  52. cout << it - v3.begin() << endl;
  53. }
  54. // 数值算法
  55. int e[] = {1, 2, 3, 4, 5};
  56. vector <int> v4(e, e + 5);
  57. for_each(v4.begin(), v4.end(), print_element);
  58. cout << endl;
  59. // 累加
  60. cout << accumulate(v4.begin(), v4.end(), 1) << endl;
  61. // 累乘
  62. cout << accumulate(v4.begin(), v4.end(), 1, mult) << endl;
  63. return 0;
  64. }
  65. // 输出
  66. 1 3 7 2 3 4 5 6 7
  67. 1 7 2 4 5 6 7 6 7
  68. 1 7 2 4 5 6 7
  69. 3 4 5 6 1 2
  70. 1 2 3 4 5 6
  71. 1
  72. 3
  73. 1 2 3 4 5
  74. 16
  75. 120
声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号