• C++ replace,replace_if和replace_copy函数用法详解(深入了解,一文学会)


     

    C++ replace,replace_if和replace_copy函数用法详解目录

    1 replace() 算法

    2 replace_if()

    3 replace_copy()


    1 replace() 算法

    会用新的值来替换和给定值相匹配的元素。它的前两个参数是被处理序列的正向迭代器,第 3 个参数是被替换的值,第 4 个参数是新的值。下面展示了它的用法:

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. using namespace std;
    10. int main()
    11. {
    12. std::deque<int> data{ 10, -5, 12, -6, 10, 8, -7, 10, 11 };
    13. std::replace(std::begin(data), std::end(data), 10, 99);
    14. // Result: 99 -5 12 -6 99 8 -7 99 11
    15. for (int i = 0; i < data.size(); i++)
    16. {
    17. cout << data[i] << " ";
    18. }
    19. }

    data 容器中和 10 匹配的全部元素都会被 99 替代。

    2 replace_if()

    会将使谓词返回 true 的元素替换为新的值。它的第 3 个参数是一个谓词,第 4 个参数是新的值。参数的类型一般是元素类型的 const 引用;const 不是强制性的,但谓词不应该改变元素。下面是一个使用 replace_if() 的示例:

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. using namespace std;
    10. int main()
    11. {
    12. string password{ "This is a good choice !" };
    13. std::replace_if(std::begin(password), std::end(password), [](char ch) {return std::isspace(ch); }, '_');
    14. //Result:This_is_a_good_choice!
    15. for (int i = 0; i < password.size(); i++)
    16. {
    17. cout << password[i] << " ";
    18. }
    19. }

    这个谓词会为任何是空格字符的元素返回 true,因此这里的空格都会被下划线代替。

    3 replace_copy()

    算法和 replace() 做的事是一样的,但它的结果会被保存到另一个序列中,而不会改变原始序列。它的前两个参数是输入序列的正向迭代器,第 3 个参数是输入序列的开始迭代器,最后两个参数分别是要被替换的值和替换值。例如:

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. using namespace std;
    10. int main()
    11. {
    12. std::vector words{ "one","none", "two", "three", "none", "four" };
    13. std::vector new_words;
    14. std::replace_copy(std::begin(words), std::end(words), std::back_inserter(new_words), string{ "none" }, string{ "0" });
    15. // Result:"one", "0", "two","three","0","four"
    16. for (int i = 0; i < new_words.size(); i++)
    17. {
    18. cout << new_words[i] << " ";
    19. }
    20. }

     

    在执行这段代码后,new_words 会包含注释中的 string 元素。 

    可以在序列中有选择地替换元素的最后一个算法是 replace_copy_if(),它和 replace_if() 算法是相同的,但它的结果会被保存到另一个序列中。它的前两个参数是输入序列的迭代器,第 3 个参数是输出序列的开始迭代器,最后两个参数分别是谓词和替换值。例如:

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. using namespace std;
    10. int main()
    11. {
    12. std::deque<int> data{ 10, -5, 12, -6, 10, 8, -7, 10, 11 };
    13. std::vector<int> data_copy;
    14. std::replace_copy_if(std::begin(data), std::end(data), std::back_inserter(data_copy), [](int value) {return value == 10; }, 99);
    15. // Result:99 -5 12 -6 99 8 -7 99 11
    16. for (int i = 0; i < data_copy.size(); i++)
    17. {
    18. cout << data_copy[i] << " ";
    19. }
    20. }

    data_copy 是一个 vector 容器,这里使用它只是为了说明输出容器可以和输入容器不同。这段代码执行后,它会包含注释中所示的元素。 

  • 相关阅读:
    faust勒索病毒:最新变种[nicetomeetyou@onionmail.org].faust袭击了您的计算机?
    【附源码】Python计算机毕业设计全国生鲜溯源平台
    vscode配置opencv/qt配置opencv)
    尚硅谷_Spring5
    Spring Security解决认证与授权的框架
    【校招VIP】产品项目分析之竞品分析
    C#中各种循环遍历的功能与应用
    (十四)重载运算符与类型转换
    Mac book pro 睡眠唤醒之后,外接显示器再也无法点亮,只能重启,怎么解决?
    计算机毕业设计Java创意产业园区管理(源码+系统+mysql数据库+lw文档)
  • 原文地址:https://blog.csdn.net/qq_37529913/article/details/125776036