文章目录
前言
在算法竞赛中,我们如果能够正确地使用宏定义的代码,能够加快我们的解题速度,与此同时,也能够加强我们所写代码的可读性,在我们测试和调整代码的时候,也可以变得更方便。
对于一般的变量定义,我们通常使用宏定义 #define或者类型定义typedef来对诸如long long、unsigned long long等变量类型较长的变量进行定义。
下面,我们将针对算法竞赛中常用的一些头文件以及变量定义进行总结和说明
一、头文件定义以及说明
1. #define debug(a)
代码如下:
#define debug(a) cout<<#a<<"="<<a<<endl;
作用: 主要用于程序的测试和调试中,比如在某个循环中,我们可以输出并观察a的值
语法说明: 在cout<<#a<<"="<<a<<endl语句中,在a的前面加上#号,是表示将a作为编程字符串,类似于int a,主要是作为一个变量使用,a的作为形参出现在宏定义中,宏是可以带形参的,像函数一样,这个a就是上面这个宏debug的形参,它也会展开,如果没有加#,编译器则会认为a不是一个变量字符串,这样就会使得编译器报错。
2. #define lyh(i,a,b) for(int i=a;i<=b;i++)
代码如下:
#define lyh(i,a,b) for(int i=a;i<=b;i++)
作用: 模拟for循环,以变量i=a为初始值从a到b进行正向迭代,由小到大(i是递增的)
3. #define hyl(i,a,b) for(int i=a;i>=b;i–)
代码如下:
#define hyl(i,a,b) for(int i=a;i>=b;i--)
作用: 反向模拟for循环,以变量i=a为初始值从a到b进行反向迭代,由大到小(i是递减的)
4. #define LL long long
代码如下:
#define LL long long
//或
typedef long long LL
#define ULL unsigned long long
//或
typedef unsigned long long ULL
作用: 定义长长整型类型的变量,增强代码的可读性
c++中常用的几种数据类型的大小范围如下表所示(主要参照为Visual Studio 2019 64位的编译器)
类型 | 存储空间大小 | 最小值 | 最大值 |
---|---|---|---|
(signed)char | 1个字节 | -128 | 127 |
unsigned char | 1个字节 | 0 | 255 |
int | 2个或4个字节 | -2 147 483 648 | 2 147 483 647 |
unsigned int | 2个或4个字节 | 0 | 4 294 967 295 |
short | 2个字节 | -32 768 | 32 767 |
unsigned short | 2个字节 | 0 | 65 535 |
long | 4个字节 | -2 147 483 648 | 2 147 483 647 |
unsigned long | 4个字节 | 0 | 4 294 967 295 |
long long (C99) | 8个字节 | -9 223 372 036 854 775 808 | 9 223 372 036 854 775 807 |
Unsigned long long (C99) | 8个字节 | 0 | 18 446 744 073 709 551 615 |
5. #define mm memset
代码如下:
#define mm memset
作用: 定义常用的初始化函数menset,包含在<string.h>或者 < c s t r i n g > <cstring> <cstring>头文件中
语法说明:
- 函数原型:
# include <string.h>
void *memset(void *s, int c, unsigned long n);
-
函数功能:
将指针变量 s 所指向的前 n 字节的内存单元用一个“整数” c 替换,由于指针变量s是void型,所以它可以为任何类型的数据进行初始化操作,例子可以观摩这篇博文 memset函数及其用法,C语言memset函数详解 -
用法示例:
int flag[50];
memset(flag, -1, sizeof(flag)); //将标志数组初始化
6. #define EPS 1e-8
代码如下:
#define EPS 1e-8
作用: 定义整数的最小值 1 − 8 1^{-8} 1−8
7. #define INF 0x7fffffff
代码如下:
#define INF 0x7fffffff
作用: 定义整数的的最大值,十六进制7fffffff
8. #define INF 0x7fffffff
代码如下:
#define INF 0x7fffffff
作用: 定义整数的的最大值,十六进制7fffffff
9. ios::sync_with_stdio(0);
代码如下:
ios::sync_with_stdio(0);
作用: 取消cin与stdio标准库的同步,加快cin、cout的反应速度,加速c++输入输出流,详情可以看这位博主的文章 关于ios::sync_with_stdio(false);和 cin.tie(0)加速c++输入输出流
二、综合
当我们将上述文件综合起来,有如下代码 (方便各位同志们复制粘贴代码)
#define debug(a) cout<<#a<<"="<<a<<endl;
#define lyh(i,a,b) for(int i=a;i<=b;i++)
#define hyl(i,a,b) for(int i=a;i>=b;i--)
#define LL long long
#define mm memset
#define EPS 1e-8
#define INF 0x7fffffff
using namespace std;
//ios::sync_with_stdio(0); //需要用的时候可以解除封印
//======================================
注:这篇文章是动态记录的,如果作者在学习的路上还遇到其他有用的宏定义也会在后续添加到文章当中
写在最后
各位看官,都看到这里了,麻烦动动手指头给博主来个点赞8,您的支持作者最大的创作动力哟! <(^-^)>
才疏学浅,若有纰漏,恳请斧正
本文章仅用于各位同志作为学习交流之用,不作任何商业用途,若涉及版权问题请速与作者联系,望悉知