📜  在竞争性编程中高效地编写C / C++代码

📅  最后修改于: 2021-05-30 10:54:40             🧑  作者: Mango

首先,您需要了解模板,宏和向量,然后再进入下一阶段!

  • 模板是通用编程的基础,它涉及以独立于任何特定类型的方式编写代码。
  • 宏是已命名的代码片段。每当使用该名称时,它就会被宏的内容替换。
  • 向量与动态数组相同,具有在插入或删除元素时自动调整自身大小的能力,并且容器自动处理其存储。

因此,我们可以使用这些功能强大的工具来有效地编写代码。

竞争编程中可以使用的一些很酷的技巧如下:

  1. 使用基于范围的for循环:这是C++ 11中的一个非常酷的功能,如果您要从头到尾进行迭代,则将是最好的选择。这段代码显示了如何使用range循环来遍历数组和向量:
    // C++ program to demonstrate range based for
    // loops for accessing vector and array elements
    #include
    #include 
    using namespace std;
      
    int main()
    {
        // Create a vector object that
        // contains 5 elements
        vector vec = {0, 1, 2, 3, 4};
      
        // Type inference by reference using auto.
        // Range based loops are preferred when no
        // modification is needed in value
        for (const auto &value : vec)
            cout << value << ' ';
      
        cout << '\n';
      
        // Basic 5 element integer array
        int array[]= {1, 2, 3, 4, 5};
        for (const auto &value: array)
            cout << value << " ";
      
        return 0;
    }
    

    输出:

    0 1 2 3 4
    1 2 3 4 5
    
  2. 初始化列表:此类型用于访问C++初始化列表中的值。在这里,这种类型的对象由编译器根据初始化列表声明自动构造,该列表是用大括号括起来的逗号分隔元素的列表。
    #include
      
    template
    void printList(std::initializer_list text)
    {
        for (const auto & value: text)
            std::cout << value << " ";
    }
      
    // Driver program
    int main()
    {
        // Initialization list
        printList( {"One", "Two", "Three"} );
        return 0;
    }
    

    输出:

    One Two Three
    
  3. 分配最大值或最小值:这一点有助于避免在编写max()或min()函数花费过多的精力。
    #include
      
    // Call by reference is used in x
    template
    static inline void amin(T &x, U y)
    {
        if (y < x)
            x = y;
    }
      
    // call by reference is used in x
    template
    static inline void amax(T &x, U y)
    {
        if (x < y)
            x = y;
    }
      
    // Driver program to find the Maximum and Minimum value
    int main()
    {
        int max_val = 0, min_val = 1e5;
        int array[]= {4, -5, 6, -9, 2, 11};
      
        for (auto const &val: array)
      
            // Same as max_val = max (max_val, val)
            // Same as min_val = min (min_val,val)
            amax(max_val, val), amin (min_val, val);
      
      
        std::cout << "Max value = " << max_val << "\n"
                  << "Min value = " << min_val;
        return 0;
    }
    

    输出:

    Max value = 11
    Min value = -9
    
  4. C / C++中的快速输入/输出:在竞争编程中,您必须尽可能快地阅读输入/输出,以节省宝贵的时间。
    #include 
      
    template void scan(T &x)
    {
        x = 0;
        bool neg = 0;
        register T c = getchar();
      
        if (c == '-')
            neg = 1, c = getchar();
      
        while ((c < 48) || (c > 57))
            c = getchar();
      
        for ( ; c < 48||c > 57 ; c = getchar());
      
        for ( ; c > 47 && c < 58; c = getchar() )
            x= (x << 3) + ( x << 1 ) + ( c & 15 );
      
        if (neg) x *= -1;
    }
      
    template void print(T n)
    {
        bool neg = 0;
      
        if (n < 0)
            n *= -1, neg = 1;
      
        char snum[65];
        int i = 0;
        do
        {
            snum[i++] = n % 10 + '0';
            n /= 10;
        }
      
        while (n);
        --i;
      
        if (neg)
            putchar('-');
      
        while (i >= 0)
            putchar(snum[i--]);
      
        putchar('\n');
    }
      
    // Driver Program
    int main()
    {
        int value;
      
        // Taking input
        scan(value);
      
        // Printing output
        print(value);
        return 0;
    }
    
    Input:  756
    Output: 756
    

    要了解有关快速输入和输出的更多信息,请阅读本文。

  5. 将宏用作for循环:也许,使用此类宏可能会降低代码的可读性,但这样做并不好,但是要编写快速代码,您可能会冒险!
    #include 
    using namespace std;
      
    #define rep(i,n) for (i = 0; i < n; ++i)
    #define REP(i,k,n) for (i = k; i <= n; ++i)
    #define REPR(i,k,n) for (i = k; i >= n; --i)
      
      
    // Driver program to test above Macros
    int main()
    {
        int i;
        int array[] = {4, 5, 6, 9, 22, 11};
        int size= sizeof(array)/sizeof(array[0]);
          
        // Default 0 index based loop
        rep(i, size)     
            cout << array[i] << " ";
        cout<<"\n";
          
        // Starting index based loop
        REP(i, 1, size-1)     
            cout << array[i] << " ";
        cout<<"\n";
          
        // Reverse for loop
        REPR(i, size-1,0)     
            cout << array[i] << " ";
        return 0;
    }
    

    输出

    4 5 6 9 22 11
    5 6 9 22 11
    11 22 9 6 5 4
    

    一些更重要的方面可以进一步减少您的时间:

  6. 使用“ bits / stdC++。h”:无需添加大量的#include行,而只需使用#include 该文件包含竞争性编程中所需的所有头文件,从而节省了很多时间。
  7. 容器:使用各种容器(例如矢量,列表,地图等),使人们能够使用预定义的功能并显着减少代码的大小(通常是减少)
  8. 快速cin和cout:如果将cin和cout用于I / O,只需在main()之后添加以下行。
    std::ios_base::sync_with_stdio(false);
  9. 自动:使用自动声明数据类型可以节省编程竞赛中的大量时间。当将变量定义为auto时,编译器会在编译时确定其类型。
  10. 库和预定义函数:在任何适用的地方都使用内置函数,例如__gcd(A,B),swap,_builtin_popcount(R),_ builtin_clz(R)等。尝试学习C++算法库中可用的各种函数,它们在程序中大多数时候都很有用

最终,通过使用这些巧妙的技巧,您可以轻松地用最少的时间和单词来编写代码。

如果您希望与行业专家一起参加现场课程,请参阅《 Geeks现场课程》和《 Geeks现场课程美国》。