cin效率之所以低,不是比C低级
是因为先把要输出的东西存入缓冲区,再输出,导致效率降低
而且是C++为了兼容C而采取的保守措施。
我们可以在IO之前将stdio解除绑定
要注意不要同时混用cout和printf之类
加速后的cin虽然较接近scanf,但仍然与之有些差距。
用快读快写可以使cin比scanf更快。
#include<iostream>
using namespace std;
int main()
{
ios::sync_with_stdio(false); //是个指令,所以不能放在头文件里
cin.tie(0);
cout.tie(0);
}
//在默认的情况下cin绑定的是cout
//每次执行 << 操作符的时候都要调用flush,这样会增加IO负担。
//可以通过tie(0)(0表示NULL)来解除cin与cout的绑定,进一步加快执行效率。
·
快读
//(当读入数据中有大量空格时,不要用快读)
//通过读入字符而后来转成数字
//原理:读入字符比数字快
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
//" << x" 操作为二进制操作,原理是将原二进制数向左平移 x 位,右边原位置以 0 补齐
//(x<<1)+(x<<3) 可视为 x * 10
//(ch^48) 效果为 ch - = '0'
·
快写
inline void write(int x)
{
char F[200];
int tmp=x>0?x:-x;
if(x<0)
putchar('-');
int cnt=0;
while(tmp>0)
{
F[cnt++]=tmp%10+'0';
tmp/=10;
}
while(cnt>0)
putchar(F[--cnt]);
}