一些 C++ 的卡常技巧
是的,这篇文章的主要内容非常好懂,相信各位同学也十分感兴趣 毕竟哪位OIer不想自己的代码跑得飞快呢?
那么我们就进入正题吧!
First
众所周知,一份代码里面必然会有很多循环打表的话当我没说,而循环自然是十分占时间的。
所以我们要做的就十分清楚了:加速循环!
1. 把 int
改成 register int
register int
表示使用cpu内部寄存器(寄存器为中央处理器内的组成部分,是有限存贮容量的高速存贮部件)的变量。
而平时的 int
是把变量放在内存中,存到寄存器中可以加快变量的读写速度。
2. 把 i++
改成 ++i
i++
是先计算再储存,而 ++i
是先储存再计算。
一般情况,两者的效率相比之下,自然是 ++i
更胜一筹。
Second
函数是很常用的一个东西,很大意义上,它可以看出我们做题的思路是否明晰。
如果你想要让你的代码的运行速度更快,可以试着在你的函数类型前面加上 inline
。
inline
可以把函数指定为内联函数,这样可以解决一些频繁调用的函数大量消耗栈空间(栈内存)的问题。
Third
俗话说得好,“十年OI一场空,不开 long long
见祖宗”。
但是long long
占用的二进制位是 int
的两倍,所以计算机处理 long long
类型的变量的时候花费的时间会更长。
Forth
有些题的输入和输出十分毒瘤,动不动就几十万几百万的数据能轻松把你的时间拉特别高。
所以,快读快写出现了,以下为快读快写代码,可直接食用。
char ch;
inline void read(int &x)
{
while((ch=getchar())<48||ch>57);
x=ch^48;
while((ch=getchar())<58&&ch>47) x=(x<<1)+(x<<3)+(ch^48);
}
Fifth
因为位运算是直接对二进制的位进行运算,而且计算机处理位运算和三目运算符要比正常计算快。
所以在写一些代码时,可以这样优化:
max(x,y) -> x>y?x:y
min(x,y) -> x<y?x:y
x%2 -> x&1
x/2 -> x>>1
x*2 -> x<<1;
Sixth
因为 using namespace std
的功能仅仅是让你在调用标准函数库的时候不在前面加上 std::
,所以为了让代码更快完全可以将他删掉。
但是因为每一次都要写 std::
太麻烦,我在这么干的时候一般都会 define _ std::
。