• 【C++】常用拷贝和替换算法


    目录

    copy

    replace

    replace_if

    swap


    常用拷贝和替换算法简介

    • copy              容器内指定范围的元素拷贝到另一个容器
    • replace          容器内指定范围的旧元素改为新元素
    • replace_if      容器内指定范围满足条件的元素替换为新元素
    • swap             互换两个容器的元素

    copy

    功能

    • 容器内指定范围的元素拷贝到另一个容器

    函数原型

    copy(iterator beg, iterator end, iterator dest);

    beg  —— 开始迭代器

    end  —— 结束迭代器

    dest —— 目标迭代器

    测试代码:

    1. #include
    2. #include
    3. #include
    4. #include
    5. using namespace std;
    6. class Person {
    7. public:
    8. Person(string name, int age) :m_Name(name), m_Age(age) {}
    9. Person() {}
    10. string m_Name;
    11. int m_Age;
    12. };
    13. ostream& operator<<(ostream& cout, const Person& p) {
    14. cout << p.m_Name << " " << p.m_Age << endl;
    15. return cout;
    16. }
    17. template<typename T>
    18. void PrintVector(const T& x) {
    19. cout << x << " ";
    20. }
    21. // 内置数据类型拷贝
    22. void test01() {
    23. vector<int>v;
    24. for (int i = 0; i < 10; ++i) {
    25. v.push_back(i);
    26. }
    27. for_each(v.begin(), v.end(), PrintVector<int>); // 遍历
    28. cout << endl;
    29. vector<int>v_target; // 目标容器
    30. v_target.resize(v.size()); // 目标容器重置大小
    31. copy(v.begin(), v.end(), v_target.begin()); // 拷贝
    32. for_each(v_target.begin(), v_target.end(), PrintVector<int>); // 遍历
    33. cout << endl;
    34. }
    35. // 自定义数据类型拷贝
    36. void test02() {
    37. vectorv;
    38. Person p1("张三", 18);
    39. Person p2("李四", 19);
    40. Person p3("王五", 20);
    41. v.push_back(p1);
    42. v.push_back(p2);
    43. v.push_back(p3);
    44. for_each(v.begin(), v.end(), PrintVector);
    45. vectorv_target; // 目标容器
    46. v_target.resize(v.size()); // 目标容器重置大小
    47. copy(v.begin(), v.end(), v_target.begin()); // 拷贝
    48. for_each(v_target.begin(), v_target.end(), PrintVector);
    49. }
    50. int main() {
    51. test01();
    52. test02();
    53. system("pause");
    54. return 0;
    55. }

    运行结果:

    copy 将原容器区间中的元素拷贝到新空间时需要用 resize 开辟内存空间。

    copy 和 vector 内置数据类型 直接用 = 的区别在于可以指定区间,另外 用 = 直接赋值自定义数据类型时需要重载 = 


    replace

    功能

    • 将容器内指定范围的旧元素(所有相同的)修改为新元素

    函数原型

    replace(iterator beg, iterator end, oldvalue, newvalue);

    beg           —— 开始迭代器

    end           —— 结束迭代器

    oldvalue    —— 旧元素

    newvalue  —— 新元素

    测试代码:

    1. #include
    2. #include
    3. #include
    4. #include
    5. using namespace std;
    6. class Person {
    7. public:
    8. Person(string name, int age) :m_Name(name), m_Age(age) {}
    9. // 重载 ==,replace 底层代码需要对比
    10. bool operator==(const Person& p) {
    11. return (p.m_Name == this->m_Name && p.m_Age == this->m_Age);
    12. }
    13. string m_Name;
    14. int m_Age;
    15. };
    16. // 重载 <<
    17. ostream& operator<<(ostream& cout, const Person& p) {
    18. cout << p.m_Name << " " << p.m_Age << endl;
    19. return cout;
    20. }
    21. template<typename T>
    22. void PrintVector(const T& x) {
    23. cout << x << " ";
    24. }
    25. // 内置数据类型替换
    26. void test01() {
    27. vector<int>v;
    28. v.push_back(10);
    29. v.push_back(30);
    30. v.push_back(30);
    31. v.push_back(40);
    32. cout << "——替换前——" << endl;
    33. for_each(v.begin(), v.end(), PrintVector<int>); // 遍历
    34. cout << endl;
    35. cout << "——替换后——" << endl;
    36. replace(v.begin(), v.end(), 30, 20); // 替换
    37. for_each(v.begin(), v.end(), PrintVector<int>); // 遍历
    38. cout << endl;
    39. }
    40. // 自定义数据类型替换
    41. void test02() {
    42. vectorv;
    43. Person p1("A", 16);
    44. Person p2("B", 17);
    45. Person p3("D", 19);
    46. v.push_back(p1);
    47. v.push_back(p2);
    48. v.push_back(p3);
    49. cout << "——替换前——" << endl;
    50. for_each(v.begin(), v.end(), PrintVector); // 遍历
    51. cout << "——替换后——" << endl;
    52. Person p4("C", 18);
    53. replace(v.begin(), v.end(), p3, p4); // 替换
    54. for_each(v.begin(), v.end(), PrintVector); // 遍历
    55. }
    56. int main() {
    57. test01();
    58. test02();
    59. system("pause");
    60. return 0;
    61. }

    运行结果:


    replace_if

    功能

    • 将区间内满足条件的元素,替换成指定元素

    函数原型

    replace_if(iterator beg, iterator end, _Pred, newvalue);

    beg           —— 开始迭代器

    end           —— 结束迭代器

    _Pred        —— 谓词

    newvalue  —— 替换的新元素

    测试代码:

    1. #include
    2. #include
    3. #include
    4. #include
    5. using namespace std;
    6. class Person {
    7. public:
    8. Person(string name, int age) :m_Name(name), m_Age(age) {
    9. if (age >= 18) this->m_Adult = true;
    10. else this->m_Adult = false;
    11. }
    12. string m_Name;
    13. int m_Age;
    14. bool m_Adult; // 是否成年
    15. };
    16. // 重载 <<
    17. ostream& operator<<(ostream& cout, const Person& p) {
    18. string if_Adult = p.m_Adult ? "成年" : "未成年";
    19. cout << p.m_Name << " " << p.m_Age << " " << if_Adult << endl;
    20. return cout;
    21. }
    22. template<typename T>
    23. void PrintVector(const T& x) {
    24. cout << x << " ";
    25. }
    26. // 替换整形的仿函数
    27. class replace_int {
    28. public:
    29. bool operator()(const int& x) {
    30. return (x >= 18);
    31. }
    32. };
    33. // 替换 Person 的仿函数
    34. class replace_Person {
    35. public:
    36. bool operator()(const Person& p) {
    37. return (p.m_Adult == false);
    38. }
    39. };
    40. // 内置数据类型选择替换
    41. void test01() {
    42. vector<int>v;
    43. v.push_back(15);
    44. v.push_back(17);
    45. v.push_back(25); // √
    46. v.push_back(18); // √
    47. v.push_back(20); // √
    48. cout << "——替换前——" << endl;
    49. for_each(v.begin(), v.end(), PrintVector<int>); // 遍历
    50. cout << endl;
    51. cout << "——替换后——" << endl;
    52. replace_if(v.begin(), v.end(), replace_int(), 18); // >= 18 替换
    53. for_each(v.begin(), v.end(), PrintVector<int>); // 遍历
    54. cout << endl;
    55. }
    56. // 自定义数据类型条件替换
    57. void test02() {
    58. vectorv;
    59. Person p1("A", 16); // √
    60. Person p2("B", 17); // √
    61. Person p3("C", 18);
    62. Person p4("D", 19);
    63. Person p5("E", 20);
    64. v.push_back(p1);
    65. v.push_back(p2);
    66. v.push_back(p3);
    67. v.push_back(p4);
    68. v.push_back(p5);
    69. cout << "——替换前——" << endl;
    70. for_each(v.begin(), v.end(), PrintVector); // 遍历
    71. cout << "——替换后——" << endl;
    72. Person R_p("*", 0);
    73. replace_if(v.begin(), v.end(), replace_Person(), R_p); // 将未成年信息替换
    74. for_each(v.begin(), v.end(), PrintVector); // 遍历
    75. }
    76. int main() {
    77. test01();
    78. test02();
    79. system("pause");
    80. return 0;
    81. }

    运行结果:


    swap

    功能

    • 互换同种类型的容器

    函数原型

    swap(container c1, container c2);

    c1 —— 容器1

    c2 —— 容器2

    测试代码:

    1. #include
    2. #include
    3. #include
    4. #include
    5. using namespace std;
    6. class Person {
    7. public:
    8. Person(string name, int age) :m_Name(name), m_Age(age) {}
    9. string m_Name;
    10. int m_Age;
    11. };
    12. ostream& operator<<(ostream& cout, const Person& p) {
    13. cout << p.m_Name << " " << p.m_Age << endl;
    14. return cout;
    15. }
    16. template<typename T>
    17. void PrintVector(const T& x) {
    18. cout << x << " ";
    19. }
    20. // 内置数据类型交换
    21. void test01() {
    22. vector<int>v1;
    23. vector<int>v2;
    24. for (int i = 0; i < 10; ++i) {
    25. v1.push_back(i);
    26. }
    27. for (int i = 10; i > 0; --i) {
    28. v2.push_back(i);
    29. }
    30. cout << "——交换前——" << endl;
    31. cout << "v1:";
    32. for_each(v1.begin(), v1.end(), PrintVector<int>);
    33. cout << endl;
    34. cout << "v2:";
    35. for_each(v2.begin(), v2.end(), PrintVector<int>);
    36. cout << endl;
    37. cout << "——交换后——" << endl;
    38. swap(v1, v2);
    39. cout << "v1:";
    40. for_each(v1.begin(), v1.end(), PrintVector<int>);
    41. cout << endl;
    42. cout << "v2:";
    43. for_each(v2.begin(), v2.end(), PrintVector<int>);
    44. cout << endl;
    45. }
    46. // 自定义数据类型交换
    47. void test02() {
    48. vectorv1;
    49. Person p1("A", 19);
    50. Person p2("B", 20);
    51. Person p3("C", 21);
    52. v1.push_back(p1);
    53. v1.push_back(p2);
    54. v1.push_back(p3);
    55. vectorv2;
    56. Person p4("D", 22);
    57. Person p5("E", 23);
    58. Person p6("F", 24);
    59. Person p7("G", 25);
    60. v2.push_back(p4);
    61. v2.push_back(p5);
    62. v2.push_back(p6);
    63. v2.push_back(p7);
    64. cout << "——交换前——" << endl;
    65. cout << "v1: " << endl;
    66. for_each(v1.begin(), v1.end(), PrintVector);
    67. cout << "v2: " << endl;
    68. for_each(v2.begin(), v2.end(), PrintVector);
    69. cout << "——交换后——" << endl;
    70. swap(v1, v2);
    71. cout << "v1: " << endl;
    72. for_each(v1.begin(), v1.end(), PrintVector);
    73. cout << "v2: " << endl;
    74. for_each(v2.begin(), v2.end(), PrintVector);
    75. }
    76. int main() {
    77. test01();
    78. test02();
    79. system("pause");
    80. return 0;
    81. }

    运行结果:

    swap 必须是同种容器交换

  • 相关阅读:
    python给企微发消息
    python+appium+pytest自动化测试-参数化设置
    MySQL代码错误号大全
    图解LeetCode——670. 最大交换(难度:中等)
    如何发现和跟踪 NFT 巨鲸?
    分公司未经授权对外签订合同是否可以
    数据库上机实验4 数据更新和视图
    组队竞赛(int溢出问题)
    Elasticsearch GC优化实践
    实用 - Java后端面试经历(经验分享)适用于2~3年
  • 原文地址:https://blog.csdn.net/xuan3215/article/details/126220784