跳到主要内容

lailai's Code Style

本文记录我在 OI 中常用的代码风格规范。

说明

我的代码风格会调整,因此旧代码可能不符合当前的规范。

参考资料

通用

兼容性

  • 代码兼容 c++17,避免使用不兼容的特性。

简洁性

  • 不包含未使用的变量,仅定义需要使用到的变量。
  • 不保留注释和调试代码。
  • 不添加多余的空行,除了开头部分的唯一空行。
  • 不添加原则上非必要的空格。除非因为特殊原因可以省略。
bool operator<(const Node &rhs) const

大括号

  • 大括号单独占一行。若代码较短,可以与条件语句同一行。
if(x<=l&&r<=y){gx(u,v,r-l+1);return;}
  • 若条件语句后只有一个语句,可以省略大括号,并与条件语句同一行。
if(n%i==0)return 0;

缩进

  • 使用 Tab 缩进,或使用 44 空格缩进。

开头

头文件

  • 使用万能头文件。若无法满足需求,可以使用其他头文件。
#include <bits/stdc++.h>

宏定义

  • 需要时可以使用宏定义。
#define mid (l+r>>1)

命名空间

  • 使用标准命名空间。
using namespace std;

空行

  • 头文件、宏定义和命名空间之后保留一个空行。

别名

  • 若代码中大量使用较长的类型名,可以使用 using 定义别名。
using ll=long long;

常量

  • 常量使用 const 定义,避免使用宏进行常量定义。
const int N=100005;

核心

主函数

  • 主函数位于代码末尾。
  • 主函数的返回值类型为 int
  • 主函数结尾有 return 0
int main()
{
...
return 0;
}

读写

  • 若需要文件读写,在主函数开头添加 freopen
freopen("problem.in","r",stdin);
freopen("problem.out","w",stdout);
  • 若数据量较大,在主函数开头添加关闭同步和优化读写。
ios::sync_with_stdio(false);
cin.tie(nullptr);
  • 使用 cincout 进行读写,避免使用 scanfprintf
  • 若无法满足需求,可以使用 getline 等其他函数。
  • 使用 '\n' 进行换行,避免使用 "\n"endl

存储

  • 小型变量应在局部范围内定义,避免使用全局变量。
  • 大型数组应定义为全局变量。
  • 若数组大小需要动态确定(如邻接表存储图),可使用 vector
vector<int> G[N];
  • 若数组大小已知,使用静态数组,避免使用 vector
int a[N];
for(int i=1;i<=n;i++)cin>>a[i];

命名

常量命名

数据范围

  • 使用大写字母 N,值为最大范围 +5+5。例如:
const int N=100005;
  • 若有多个变量的范围,可以用 MK 等其他大写字母。

模数

  • 使用 mod,大小根据需求设置。例如:
const int mod=998244353;

无穷大

  • 使用 inf,范围根据需求选择 intlong long
const int inf=0x3f3f3f3f;
const ll inf=0x3f3f3f3f3f3f3f3f;
提示
  1. 无穷大 inf 为正数,负无穷大使用 -inf,避免将 inf 设为负数。
  2. 为了保证可以使用 memset 初始化,使用 (3f3f3f3f)16(3f3f3f3f)_{16}(3f3f3f3f3f3f3f3f)16(3f3f3f3f3f3f3f3f)_{16}

极小值

  • 使用 eps,大小根据需求设置。例如:
const double eps=1e-8;

圆周率

  • 使用 pi,值为 arccos(1)\arccos{(-1)}
const double pi=acos(-1);

变量命名

多组数据

  • 使用大写字母 T
int T;
cin>>T;
while(T--)
{

}

组数序号

  • 使用美元符号 $
int T;
cin>>T;
for(int $=1;$<=T;$++)
{
cout<<$<<'\n';
}

数据范围

  • 使用题目中所给的小写字母,一般为 n
int n;
cin>>n;

操作次数

  • 使用题目中所给的小写字母,一般为 mq
int m;
cin>>m;
while(m--)
{

}

通用变量

  • op:操作种类。
  • res:函数的返回值或局部结果。
  • ans:最终答案。
  • cnt:计数器。
  • tmp:临时变量。
  • mx:最大值。
  • mn:最小值。