首先,您需要了解模板,宏和向量,然后再进入下一阶段!
- 模板是通用编程的基础,它涉及以独立于任何特定类型的方式编写代码。
- 宏是已命名的代码片段。每当使用该名称时,它就会被宏的内容替换。
- 向量与动态数组相同,具有在插入或删除元素时自动调整自身大小的能力,并且容器自动处理其存储。
因此,我们可以使用这些功能强大的工具来有效地编写代码。
竞争编程中可以使用的一些很酷的技巧如下:
- 使用基于范围的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
- 初始化列表:此类型用于访问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
- 分配最大值或最小值:这一点有助于避免在编写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
- 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
要了解有关快速输入和输出的更多信息,请阅读本文。
- 将宏用作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
一些更重要的方面可以进一步减少您的时间:
- 使用“ bits / stdC++。h”:无需添加大量的#include行,而只需使用#include
该文件包含竞争性编程中所需的所有头文件,从而节省了很多时间。 - 容器:使用各种容器(例如矢量,列表,地图等),使人们能够使用预定义的功能并显着减少代码的大小(通常是减少)
- 快速cin和cout:如果将cin和cout用于I / O,只需在main()之后添加以下行。
std::ios_base::sync_with_stdio(false);
- 自动:使用自动声明数据类型可以节省编程竞赛中的大量时间。当将变量定义为auto时,编译器会在编译时确定其类型。
- 库和预定义函数:在任何适用的地方都使用内置函数,例如__gcd(A,B),swap,_builtin_popcount(R),_ builtin_clz(R)等。尝试学习C++算法库中可用的各种函数,它们在程序中大多数时候都很有用
最终,通过使用这些巧妙的技巧,您可以轻松地用最少的时间和单词来编写代码。
如果您希望与行业专家一起参加现场课程,请参阅《 Geeks现场课程》和《 Geeks现场课程美国》。