编程码风汇总
shaoziqi
2022-02-20 18:51:46
### 此文章方便您了解 ~~shaoziqi这个蒟蒻~~和 OIer的码风
------------
### 目录:
> **1. 前言**
>
> **2. 码风说明**
>
> 2-1. 注释代码
>
> 2-2. 代码人身攻击
>
> 2-3. 打空格
>
> 2-4. 自定义函数
>
> 2-5. 万能头
>
> 2-6. 大括号
>
> 2-7. 快读
>
> 2-8. STL
>
> **3. 后记**
------------
### 1. 前言
众所周知,每个人都有自己的**码风**,无论**AFOer**或**现役OIer**,各自的码风也是千奇百怪。
在这里引用一个**我所看到的最奇怪的代码**:
```cpp
airport.inputln<<("%d%d%d",n,m,s).split();
System.out.airport.writeln>>("%d\n",&k)>>endl;
```
**~~我看不懂,但是我大受震撼~~**
我也不知道这里面包含了几种编程语言
**Upd:** 后来才知道是**OIer**用的三种语言~~大杂烩~~。
所以,我必须要做一期**编程码风**的汇总。
### 2. 码风说明
**2-1**. **注释代码**
一般的**大犇**都喜欢给代码上注释(**当然指有意义的注释**),以方便自己在打代码时**可以了解自己之前的解题思路**。
这里举一个例子:
```cpp
if(j>=a[i]){
d[j]-max(d[j-1],d[j-a[i]]); //这里用来完成一维数组的 dp
} //如果是10^6的数据规模应该会有80分
```
但是如果你没有注释,很难让自己或者他人**理解你代码的思路**。
比如说:
```cpp
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
qaq(i);
kkk();
}
orz();
```
尤其是这种使用**一大堆自定义函数的程序**,解题思路就很难懂。
**Upd:** ~~这是我代码~~。
**2-2**. **代码人身攻击**
在此提醒各位:**辱骂有风险,整活需谨慎**!
鉴于 **€€£** 的一系列 ~~**save money**~~ **的行为**,因此万千 OIer 在考场上有辱骂 CCF 的行为。
甚至以至于禁三年
举个例子:
```cpp
return 0; //CCFrnm退钱
```
~~**鲜活的禁三人**~~:
```cpp
ccf[i][j]=dp(i-1,min(j-ccf[i-1][j],114514));
```
**Upd**: **以上代码均有出处**,为避免人身攻击不将其**公布**。
**2-3**. **打空格**
有一些**大佬**,喜欢在代码**拥挤**时打空格以方便**找错和调试**。
还有一些人为了**节省码代码的时间**,不打空格。
总之,这个习惯因人而异,而不是 OIer **强求的习惯**。
**还是举个例子**:
```cpp
for (int i = 1;i <= n;i ++) {
int k = a [i];
if (k <= a[i - 1]) ans ++;
}
```
**以及另一个例子**:
```cpp
for(int i=1;i<=n;i++) {
int k=a[i];
if(k<=a[i-1]) ans++;
}
```
**upd:** ~~我似乎不怎么打空格??~~
**2-4**. **自定义函数**
自定义函数可以**让主程序更简洁**,有时候也可以**让代码思路更清晰**(当然有时候可能会增加复杂度)。
在代码中一些自定义函数是**很有用的**,比如 **dfs,bfs,dp,cmp** 等,还有一些函数如果不在**根本上改变性质**是**毫无用处**的,比如 **max,min,sqrt** 等。
在**大部分时候**,自定义函数是能帮助到您解决**很多实际性问题的**。
一个**大佬**的主程序:
```cpp
#include <bits/stdc++.h>
#define ......
......
using namespace std;
......
void imp(int k,int t)
{
......
}
void ......
......
int main()
{
int n,m;
ios::sync_with_stdio(false);
cin>>n>>m;
imp(n,m,1);
cos(a[1],d[1][1]);
dfs(n,1);
outans(d[1][1]);
return 0;
}
```
~~这个代码**长约 200 行**我就不放了 %%%Orz 大佬~~。
另一部分人的主程序:
```cpp
#include <bits/stdc++.h>
using namespace std;
int main()
{
......
return 0;
}
```
同样 **150 多行的代码**很明显就**烦琐**了。
**Upd:** 感觉身边 **dalao** 真多啊。
**2-5**. **万能头**
根据可靠消息得:万能头会占用 **2MB 的空间**!
```cpp
#include <bits/stdc++.h>
```
这个万能头包含了 **C++ 所有的头文件**,解决了**无数人苦记头文件的痛苦**。
**Upd:** ~~想当初我在小六时为了记头文件差点 **JC**~~ ......
但是,真正的**巨佬**是不会用头文件的!他们宁可**记头文件**也不要**多余的内存消耗**。
**为伟大的 OIer 们致敬!!!**
至于 C++ 有多少头文件,懂的都懂。
**Upd:** 我没有考虑 P 党的想法**十分抱歉**!
**2-6**. **大括号**
一些人喜欢在代码**循环和判断语句**外打大括号。
这其实是**很好的习惯**,这可以让更多人看出**代码的运行方便调试**。
**代码比对**如下:
```cpp
for(int i=1;i<=n;i++){
int k=a[i];
for(int j=1;j<=n;j++)
if(k<=a[j])
k=a[j];
cout<<k<<endl;
}
```
还有一份:
```cpp
for(int i=1;i<=n;i++){
int k=a[i];
for(int j=1;j<=n;j++){
if(k<=a[j]){
k=a[j];
}
}
cout<<k<<endl;
}
```
通过比对,很明显看出来**代码二更有条理性**,虽然**它们的运行都是一样的**。
**2-7**. **快读**
一般来说,**快读可以减少运行时间**。
常见的快读有以下几种:
**(1) 函数**:
```cpp
ios::sync_with_stdio(false);
```
**(2) 模板**:
```cpp
inline int read()
{
char ch=getchar();
long long f=1,res=0;
while(ch<'0'||ch>'9')
{
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
res=(res<<1)+(res<<3)+ch-48,ch=getchar();
}
return res*f;
}
```
**类似的还有快写模板:**
```cpp
inline void write(long long x)
{
char buf[100];
int len=-1;
if(x>=0) while(x) buf[++len]=x%10+48,x/=10;
else
{
putchar('-');
while(x) buf[++len]=-(x%10)+48,x/=10;
}
while(len>=0){
putchar(buf[len--]);
}
}
```
如果考场上**模板**不会,那就用函数吧!
**2-8**. **STL**
C++ 有个好东西,叫 **STL**,经常能帮助大佬们**完成一大半的操作**。
**(1)栈**
```cpp
vector<int> v;
```
**vector** 是个好东西,可以**自动模拟实现栈**。
**(2)快排**
```cpp
sort(a+1,a+n+1);
```
这么一个**快排函数**,完成了手动模拟**几十行**的程序。
**(3)映射**
```cpp
map<string,int> mp;
```
这个函数,**不用 dfs 用一重循环完成了两重循环**完成的事。
**(4)其他函数**
对于函数而言,使用者是**操作者本人**,这个习惯也是**因人而异**。但是谨记一点:**STL 好用,但是不能滥用**!
### 3. 后记
### 无数人,无数码风,为的是心中不变的信仰!
**谨以此文致敬所有 OIer!!!**