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