更快的读入优化fread

原博客:震惊!99.999%的OIER都不知道!我竟然学了假读优!竟然有这样的读优!—by Sdywolf

原来的读优是这样写的:

int _read(){
    int sum=0;char ch=getchar();
    while(!(ch>='0'&&ch<='9'))ch=getchar();
    while(ch>='0'&&ch<='9')sum=sum*10+ch-48,ch=getchar();
    return sum;
}

可是,遇到数据流大的题目(如4*10^6),如果你的电脑不够快,还是会超时。

最近请教了Manchery大神,才发现读优是这样写的:

inline char nc(){
    static char buf[100000],*p1=buf,*p2=buf;
    return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline int _read(){
    char ch=nc();int sum=0;
    while(!(ch>='0'&&ch<='9'))ch=nc();
    while(ch>='0'&&ch<='9')sum=sum*10+ch-48,ch=nc();
    return sum;
}

其中的nc函数就相当于原来的getchar();

这个函数的原理就是先把数据流中的一整段都存下来,然后从这个数组里读取,直到数组读空了再重新从数据流中读取,由于是整段整段读取,所以自然比getchar()要快的多。
=====以下为转载者添加=====
不过我们会发现,一旦用了这个读入优化。getchar,scanf都不能用了(存到buf里了),所有读入都必须自己写了。所以说数据流不是太大的时候(如1*10^6),可以考虑不用这个读入优化。

你可能感兴趣的:(实用功能)