c/c++輸入時間問題


大家都知道c++兼容完整的c,從理論上來講cin和cout的速度應該遠遠大於c中scanf和printf。

 

但是在真真做題的時候,當數據輸入次數足夠多的時候,用cin/cout的會超,而用scanf/printf則能過題,這是為什么?

 

1.結論:

默認情況,cin與stdin總是保持同步的,也就是說這兩種方法可以混用,而不必擔心文件指針混亂,同時cout和stdout也一樣,兩者混用不會輸 出順序錯亂。正因為這個兼容性的特性,導致cin有許多額外的開銷,如何禁用這個特性呢?只需一個語句 std::ios::sync_with_stdio(false);,這樣就可以取消cin於stdin的同步了,此時的cin就與scanf差不多 了。

另一種解釋: cout在輸出時總是要先將輸出的存入緩存區。而printf直接調用系統進行IO,它是非緩存的。所以cout比printf慢。

 

 

sync_with_stdio

這個函數是一個“是否兼容stdio”的開關,C++為了兼容C,保證程序在使用了std::printf和std::cout的時候不發生混亂,將輸出流綁到了一起。

 

tie

tie是將兩個stream綁定的函數,空參數的話返回當前的輸出流指針。

 

解決cin慢的辦法:在輸入前加入如下三行代碼即可。

int main()
{
    ios::sync_with_stdio(false);//關閉c++兼容c的特性 
    cin.tie(0);//加速cin 
    cout.tie(0);//加速cout 
    
    return 0;
}

 

 

 

 

2.有些毒瘤出題人,會卡scanf的時間,也就是說要另尋更快的輸入。---->getchar()  輸入中的邪教

 

 

借鑒博客:https://blog.csdn.net/qq_34287501/article/details/70232038

 

 

整數:

inline bool scan_d(int &num)  
{
        char in;bool IsN=false;
        in=getchar();
        if(in==EOF) return false;
        while(in!='-'&&(in<'0'||in>'9')) in=getchar();
        if(in=='-'){ IsN=true;num=0;}
        else num=in-'0';
        while(in=getchar(),in>='0'&&in<='9'){
                num*=10,num+=in-'0';
        }
        if(IsN) num=-num;
        return true;
}

 

 

浮點數:

inline bool scan_lf(double &num)  
{
        char in;double Dec=0.1;
        bool IsN=false,IsD=false;
        in=getchar();
        if(in==EOF) return false;
        while(in!='-'&&in!='.'&&(in<'0'||in>'9'))
                in=getchar();
        if(in=='-'){IsN=true;num=0;}
        else if(in=='.'){IsD=true;num=0;}
        else num=in-'0';
        if(!IsD){
                while(in=getchar(),in>='0'&&in<='9'){
                        num*=10;num+=in-'0';}
        }
        if(in!='.'){
                if(IsN) num=-num;
                return true;
        }else{
                while(in=getchar(),in>='0'&&in<='9'){
                        num+=Dec*(in-'0');Dec*=0.1;
                }
        }
        if(IsN) num=-num;
        return true;
}

 

 

強烈輸入掛(直接交,看結果需要用文件):

#define FI(n) FastIO::read(n)
 
namespace FastIO {
    const int SIZE = 1 << 16;
    char buf[SIZE], obuf[SIZE], str[60];
    int bi = SIZE, bn = SIZE, opt;
    int read(char *s) {
        while (bn) {
            for (; bi < bn && buf[bi] <= ' '; bi++);
            if (bi < bn) break;
            bn = fread(buf, 1, SIZE, stdin);
            bi = 0;
        }
        int sn = 0;
        while (bn) {
            for (; bi < bn && buf[bi] > ' '; bi++) s[sn++] = buf[bi];
            if (bi < bn) break;
            bn = fread(buf, 1, SIZE, stdin);
            bi = 0;
        }
        s[sn] = 0;
        return sn;
    }
    bool read(int& x) {
        int n = read(str), bf;
 
        if (!n) return 0;
        int i = 0; if (str[i] == '-') bf = -1, i++; else bf = 1;
        for (x = 0; i < n; i++) x = x * 10 + str[i] - '0';
        if (bf < 0) x = -x;
        return 1;
    }
};

 


免責聲明!

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



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