比“讀入優化”更優的讀入方式


序:
相信很多OIer在讀取大量數據的時候普遍采取讀入優化的方式讀入(代碼如下,基本類似):

inline void read()//無符號型
{
    static char c;
    input = 0;
    c = getchar();
    while(c < '0' || c > '9')   c = getchar();
    while(c >= '0' && c <= '9')
    {
        input = input*10+c-'0';
        c = getchar();
    }
    //return input;
    return ;
}

通過其他博客我們發現比這樣更快的是fread,可惜不會用…
經過尋找,在知乎上找到了比讀入優化更快的方法。
測試表明比讀入優化快10%。


代碼如下:

char buffer[maxn],*S,*T; 
inline char Get_Char()  
{  
    if(S==T)  
    {  
        T=(S=buffer)+fread(buffer,1,maxn,stdin);
        if(S==T) return EOF;  
    }  
    return *S++;  
}

int Get_Int()
{
    char c;  
    int re=0;  
    for(c=Get_Char();c<'0'||c>'9';c=Get_Char());  
    while(c>='0'&&c<='9')  
           re=(re<<1)+(re<<3)+(c-'0'),c=Get_Char();  
    return re;  
}

對比讀入優化讀入一千萬個的無符號型int型整數(循環10次)。
結果如下:
5.778000 0.577800(傳統)
5.078000 0.507800(新)


在知乎上的討論還給出了幾種很快的讀入方式,但是代碼格式比較混亂或太長,故不附代碼。
原答案地址:如何看待在OI/ACM賽事廣為使用的快速讀入整數?

自此整理結束。
箜瑟_qi 2017.04.15 17:21

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM