快讀&快寫模板
快讀快寫,顧名思義,就是提升輸入和輸出的速度。在這里簡單介紹一下幾種輸入輸出的優劣。
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)