快讀&快寫模板【附O2優化】


快讀&快寫模板

快讀快寫,顧名思義,就是提升輸入和輸出的速度。在這里簡單介紹一下幾種輸入輸出的優劣。

C++ cin/cout 輸入輸出:優點是讀入的時候不用管數據類型,也就是說不用背scanf/printf的%d、%c、%lld等繁瑣的東西,但是缺點就是比scanf/printf慢一些。

C scanf/printf 輸入輸出:與C++對比,比cin/cout快一些,但使用方法細節比較多,容易出鍋。

快讀/快寫:只能處理整數讀入/輸出,但是要比標准輸入輸出函數都快得多。

  • 一般來講,快讀快寫在針對數據量不是很大的輸入輸出的時候顯得比較無力,但如果是多組數據或者輸入量較多,就可以顯著提升效率。

  • 開不開inline差不多。

  • 還有一種更快的fread()函數型快讀,比一般的快讀都要快,但是模板不太好理解,所以不加介紹。

快讀模板及實現原理

快讀是在字符讀入的基礎上進行效率優化的,其實現原理也很簡單,看代碼就可以理解了。x變量記錄大小,f變量判斷正負。

模板代碼:

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*10+ch-'0',ch=getchar();
    return x*f;
}

(注:本人無壓行習慣,所以造成行數比較多,實際使用的時候可以把它壓縮,比較好調)

優化快讀模板

機房大佬說這是快讀的另一套模板,但是本蒟蒻以為這是同一種模板,只不過這個模板在讀入速度上進行了優化而已。在原來的模板字符讀入的基礎上進行了提速。嗖嗖快。

代碼:

char *p1,*p2,buf[100000];
#define nc() (p1==p2 && (p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)
int read()
{
    int x=0,f=1;
    char ch=nc();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')
            f=-1;
        ch=nc();
    }
    while(ch>='0'&&ch<='9')
        x=x*10+ch-'0',ch=nc();
   	return x*f;
}

快寫模板及實現原理

快寫其實也是在字符輸出(普遍認為字符輸出比標准輸出流快)的基礎上進行按位分解,遞歸輸出的。其基本原理還是先判正負再分解輸出的。

模板代碼:

void write(int x)
{
    if(x<0)
        putchar('-'),x=-x;
    if(x>9)
        write(x/10);
    putchar(x%10-'0');
    return;
}

附:O2優化

我們不用管O2優化的原理,只需要記住這個優化能使得程序的效率大大提高(我Jio得到底能提多少還是得看RP)。

手動打開O2開關:

#pragma GCC optimize(2)


免責聲明!

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



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