C++读入优化的黑科技

输出优化

除了读入的黑科技以外,输出也有黑科技。
和fread对应,输出黑科技叫fwrite,就是把一整个字符串(快速地)写进输出文件。
也就是说在输出的时候,把输出的内容存进字符串,再用fwrite输出会很快(实验结果待填)

格式fwrite(buf,1,bufl,outfile)
其中size为1,表示将buf的前bufl个字符扔进输出文件outfile
当然也可以是stdout

模板(P.S:这个模板之后更新了然后因为太长被我废除了)

(不够完整)

const double eps=1e-6;
struct inout{
    static const int ibufl=1<<25;
    static const int obufl=1<<10;
    char in_buf[ibufl],out_buf[obufl],*inf,*ouf;
    void init(){
        fread(in_buf,1,ibufl,stdin);
        inf=in_buf;
        ouf=out_buf;
    }
    inout& operator >>(int &a){
        int fh=1;
        while(!(isdigit(*inf)||*inf=='-'))++inf;
        if(*inf=='-')fh=-1,++inf;
        a=0;
        while(isdigit(*inf)){a=a*10+*inf-'0';++inf;}
        a*=fh;
        return *this;
    }
    inout& operator >>(char &a){
        while(*inf==' '||*inf=='\n')++inf;
        a=*inf;
        ++inf;
        return *this;
    }
    inout& operator >>(char *a){
        while(*inf==' '||*inf=='\n')++inf;
        while(!(*inf==' '||*inf=='\n')){*a=*inf;++inf;++a;}
        *a='\0';
        return *this;
    }
    inout& operator >>(double &a){
        int fh=1;
        double s;
        while(!(isdigit(*inf)||*inf=='-'))++inf;
        if(*inf=='-')fh=-1,++inf;
        a=0;
        while(isdigit(*inf)){a=a*10+*inf-'0';++inf;}
        if(*inf=='.'){
            s=0.1;
            ++inf;
            while(isdigit(*inf)){
                a+=s*(*inf-'0');
                ++inf;
                s*=0.1;
            }
        }
        a*=fh;
        return *this;
    }
    void writeint(int x){
        if(x/10)writeint(x/10);
        *ouf=x%10+'0';
        ++ouf;
    }
    inout& operator <<(int a){
        
        if(a<0){*ouf='-';++ouf;a=-a;}
        writeint(a);
        return *this;
    }
    static const int sz=2;
    inout& operator <<(char a){
        *ouf=a;++ouf;
        return *this;
    }
    inout& operator <<(char *a){
        while(*a){
            *ouf=*a;
            ++ouf;
            ++a;
        }
        return *this;
    }
    inout& operator <<(double a){
        if(a<-eps){*ouf='-';++ouf;a=-a;}
        writeint((int)a);
        a-=(int)a;
        *ouf='.';
        ++ouf;
        up(i,1,sz){
            a=a*10;
            *ouf=(int)a+'0';
            ++ouf;
            a-=(int)a;
        }
        return *this;
    }
    void out(){
        fwrite(out_buf,1,ouf-out_buf,stdout);   
    }
};
inout io;

一些常量的含义:

eps表示一个非常小的数用来对double进行比较。
ibufl和obufl分别表示读入文件和输出文件的大小。
size表示输出小数的位数。
当然这些都可以修改

用法:

首先io.init()
读入像cin一样io>>a>>b
输出像cout一样io<<a<<b
最后io.out()

注意

如果输入浮点数可能出现科学计数法,千万不要直接用,要加一些修改,否则后果很惨的。
Cry

标签: 黑科技

添加新评论