zoukankan      html  css  js  c++  java
  • C++ STD Gems01

    本文是根据油管大神的C++标准库课程的一个学习笔记,该课程主要介绍c++标准库中一些非常有用并且代码经常用到的工具。

    copy 、copy_backward 、copy_n 、copy_if、swap_ranges

    #include <iostream>
    #include <iterator>
    #include <string>
    #include <algorithm>
    #include <vector>
    #include <cctype>
    
    
    template<typename Container>
    void write_to_cout(const Container& container, const char* delimiter = " ")
    {
        std::copy( container.begin(), container.end(),
            std::ostream_iterator<typename Container::value_type>( std::cout, delimiter) );
    }
    
    
    // 测试函数copy
    void test0()
    {
        // init test constainer
        std::vector<std::string> a = {"zero", "one", "two", "three", "four", "five", "six"};
        std::vector<std::string> b = {"0", "1", "2", "4", "5", "6", "7", "8", "9"};
    
        // wtire initial statements
        write_to_cout(a);
        std::cout << std::endl;
        write_to_cout(b);
        std::cout << std::endl;
    
        //test algorithm
        std::copy(a.begin(), a.begin() + 3, b.begin() + 4);
        write_to_cout(b);
        std::cout << std::endl;
        std::cout << std::endl;
    }
    
    void test1()
    {
        std::vector<std::string> a = {"zero", "one", "two", "three", "four", "five", "six"};
        std::vector<std::string> b = {"0", "1", "2", "4", "5", "6", "7", "8", "9"};
    
        write_to_cout(a);
        std::cout << std::endl;
        write_to_cout(b);
        std::cout << std::endl;
    
        std::copy(a.begin(), a.end(), std::back_inserter(b));
        write_to_cout(b);
        std::cout << std::endl;
        std::cout << std::endl;
    }
    
    void test2()
    {
        // std::vector<std::string> a = {"zero", "one", "two", "three", "four", "five", "six"};
        std::vector<std::string> b = {"0", "1", "2", "4", "5", "6", "7", "8", "9"};
    
        // write_to_cout(a);
        // std::cout << std::endl;
        write_to_cout(b);
        std::cout << std::endl;
    
        // test algorithm
        std::copy(b.begin(), b.begin() + 4, b.begin() +3);  // 元素从前往后挨个复制过去
        write_to_cout(b);
        std::cout << std::endl;
        std::cout << std::endl;
    }
    
    void test3()
    {
        std::vector<std::string> a = {"zero", "one", "two", "three", "four", "five", "six"};
        std::vector<std::string> b = {"0", "1", "2", "4", "5", "6", "7", "8", "9"};
    
        write_to_cout(a);
        std::cout << std::endl;
        write_to_cout(b);
        std::cout << std::endl;
    
        //test algorithm
        std::copy_backward(a.begin(), a.begin() + 2, b.begin() + 3); //从后往前挨个复制过去
        write_to_cout(b);
        std::cout << std::endl;
        std::cout << std::endl;
    }
    
    void test4()
    {
        std::vector<int> a;
        std::copy_n(std::istream_iterator<int>(std::cin), 5, std::back_inserter(a)); // 输入指定的数量的元素
        write_to_cout(a);
        std::cout << std::endl;
        std::cout << std::endl;
    }
    
    void test5()
    {
        std::string a = "HellO, WOrlD";
        std::string b = "wHat are yoU dOinG";
    
        write_to_cout(a);
        std::cout << std::endl;
        write_to_cout(b);
        std::cout << std::endl;
    
        //test algorithm
        std::string uppers;
        // 有条件地复制
        std::copy_if(a.begin(), a.end(), std::back_inserter(uppers), [](unsigned char c){return std::isupper(c);} );  // 为什么直接写std::isupper不行呢
        std::copy_if(b.begin(), b.end(), std::back_inserter(uppers), [](unsigned char c){return std::isupper(c);} );
    
        write_to_cout(uppers);
        std::cout << std::endl << std::endl;
    }
    
    void test6()
    {
        std::vector<std::string> a = {"zero", "one", "two", "three", "four", "five", "six"};
        std::vector<std::string> b = {"0", "1", "2", "4", "5", "6", "7", "8", "9"};
    
        write_to_cout(a);
        std::cout << std::endl;
        write_to_cout(b);
        std::cout << std::endl;
    
        //test algorithm
        std::swap_ranges(a.begin(), a.begin() + 3, b.begin());  //作用于copy等效
        write_to_cout(b);
        std::cout << std::endl << std::endl;
    
    }
    
    int main()
    {
        test0(); 
        test1();
        test2();
        test3();
        test4();
        test5();
        test6();
        return 0;
    }
    
  • 相关阅读:
    UVa 1451 Average (斜率优化)
    POJ 1160 Post Office (四边形不等式优化DP)
    HDU 3507 Print Article (斜率DP)
    LightOJ 1427 Substring Frequency (II) (AC自动机)
    UVa 10245 The Closest Pair Problem (分治)
    POJ 1741 Tree (树分治)
    HDU 3487 Play with Chain (Splay)
    POJ 2828 Buy Tickets (线段树)
    HDU 3723 Delta Wave (高精度+calelan数)
    UVa 1625 Color Length (DP)
  • 原文地址:https://www.cnblogs.com/codemeta-2020/p/12111605.html
Copyright © 2011-2022 走看看