编程码风汇总

shaoziqi

2022-02-20 18:51:46

Personal

### 此文章方便您了解 ~~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!!!**