快讀快寫 原理詳解
快讀快寫原理詳解[TOC]C++的`cin``cout`和C的`scanf``printf`等IO函數(shù)
2023-07-29C++ 的 cin
cout
和 C 的 scanf
printf
等 IO 函數(shù)已經(jīng)夠我們是用了,但是它們很慢,盡管 cin
cout
可以取消同步以優(yōu)化,但還是不夠快.
所以我們需要找一種更快的方式來輸入輸出,以防在 OI 中出現(xiàn) TLE 的情況,便有了快讀快輸.
代碼快讀 read quickly注:它們只能讀取整數(shù)
(資料圖片)
templateinline void rq(T& x) { x = 0; char c; bool sign = 0; while(!isdigit(c = getchar())) if(c == "-") sign = 1; do x = (x << 3) + (x << 1) + (c ^ 48); while(isdigit(c = getchar())); if(sign) x = -x; return;}
快寫 write quicklytemplateinline void wq(const T& x) { T t = x; static char _wq_buffer[39]; int bp = -1; if(!t) { putchar("0"); return; } if(t < 0) putchar("-"), t = -t; while(t) { _wq_buffer[++bp] = t % 10 + "0"; t /= 10; } for(int i = bp; i >= 0; i--) putchar(_wq_buffer[i]); return;}
代碼解釋快讀第一部分templateinline void rq(T& x)
template
是一個(gè) C++ 的關(guān)鍵字,在這里它的作用是聲明函數(shù)模板. 尖括號里的 class T
可以理解為聲明一個(gè)類型 T
,這里的 class
也可以替換成 typename
,并無兩樣.
這個(gè) T
是什么類型一般取決于這里的 x
是什么類型. 例如:
int x;rq(x); // T = intlong long y;rq(y); // T = long longchar z;rq(z); // T = char
inline
是 內(nèi)聯(lián),在這里是 內(nèi)聯(lián)函數(shù),加上它可能會(huì)讓程序運(yùn)行的速度變快,類似于宏展開,但它做出的優(yōu)化取決于編譯器和函數(shù)的復(fù)雜程度, 有興趣的可以看這位大佬的博客.
void
在這里的意思是無返回類型函數(shù).
T& x
在這里是 引用傳參,在此函數(shù)內(nèi)更改 x
對應(yīng)傳進(jìn)來的參數(shù)也會(huì)更改,這里它和指針極為相似:
void swap1(int& a, int& b) { int t = a; a = b; b = t;}void swap2(int* a, int* b) { int t = *a; *a = *b; *b = t;}int main() { int x = 1, y = 2; swap1(x, y); // x = 2, y = 1 swap2(&x, &y); // x = 1, y = 2}
這兩個(gè)的函數(shù)的功能都一樣,在匯編層面也一樣,只不過 swap1
比 swap2
的寫法更簡便,更像是 C++ 相對于 C 特有的語法糖.
x = 0;char c;bool sign = 0;
x = 0
,這里一般清零,因?yàn)閭鬟M(jìn)來的 x
的值不確定,如果不是 \(0\) 會(huì)導(dǎo)致接下來的運(yùn)算出錯(cuò),從而導(dǎo)致讀入無效. 如果可以保證傳進(jìn)來的 x
等于 \(0\) ,則可以省略這一行.
char c
,這個(gè) c
是讀入的字符,一般 IO 都是靠字符,然后再轉(zhuǎn)化為數(shù)字等別的類型.
bool sign = 0
,這個(gè) sign
表示 x 的符號,\(0\) 表示 \(x \geq 0\) ,\(1\) 表示 \(x < 0\) . 在這里必須清零,因?yàn)檫@是在函數(shù)內(nèi),如果不清零,它的值是不確定的,從而導(dǎo)致 x
的正負(fù)性受到影響. 如果可以保證讀入的數(shù)是一個(gè)非負(fù)整數(shù),則可以省略這一行以及相關(guān)的內(nèi)容.
while(!isdigit(c = getchar())) if(c == "-") sign = 1;
此部分是跳過不是數(shù)字的時(shí)候并確定 x
的符號.
c = getchar()
是讀入一個(gè)字符,getchar()
是一個(gè)較快的方法,比 cin >> c
和 scanf("%c", &c)
快.
!isdigit(...)
是判斷該字符是否是一個(gè)非數(shù)字. 為什么不用 a < "0" || "9" < a
之類的?因?yàn)橹苯?!isdigit(...)
比這個(gè)快,isdigit
內(nèi)部實(shí)現(xiàn)類似于打表,有興趣的可以看這位大佬的博客.
if(c == "-") sign = 1;
顯然是確定符號. 但是這種判斷有個(gè)缺點(diǎn),當(dāng)輸入:
ho-mo114514
時(shí),sign = 1
,顯然這是不正確的.
如果可以保證一開始讀入的就是符號或是有效數(shù)字位,或已知輸入的格式,則可以刪除這個(gè) while
循環(huán)并做出相應(yīng)的更改. (我建議還是不要?jiǎng)h,刪了之后處理格式會(huì)很麻煩)
do x = (x << 3) + (x << 1) + (c ^ 48);while(isdigit(c = getchar()));
此部分是邊讀邊更改 x
.
(x << 3) + (x << 1)
是 x * 10
.
x << 3
表示將 x
的二進(jìn)制位左移三位,x << 1
同理.
什么是左移、右移?
假設(shè)
a
是一個(gè) \(8\) 位的數(shù),并且a = 4
,則a
在二進(jìn)制下是00000100
.左移三位得00010000
,表示 \(32\) ,也就是 \(4 \times 2^3\)不難得出
a << b
\(=a \times 2^b \space (b \geq 0)\) ,a >> b
\(=a \div 2^b \space (b \geq 0)\) .
則上面的表達(dá)式等價(jià)于 \(x \times 2^3 + x \times 2^1 = x \times 8 + x \times 2 = x \times 10\) .
c ^ 48
是 c - "0"
,將一個(gè)數(shù)字字符化為數(shù)字.
其中 ^
表示異或,在數(shù)學(xué)中用 \(\bigoplus\) 表示,有基本的四種基本的運(yùn)算法則:\(0 \bigoplus 0 = 0\) ,\(0 \bigoplus 1 = 1\) ,\(1 \bigoplus 0 = 1\) ,\(1 \bigoplus 1 = 0\). (同0異1)
\(48\) 在 ASCII 中對應(yīng)的字符是 0
,二進(jìn)制是 00110000
if(sign) x = -x;
此部分是添加 x
的符號. 有的可能把 -x
寫成 ~(x - 1)
,這都表示取 x
的倒數(shù),在匯編層面都一樣,會(huì)被編譯器優(yōu)化.
templateinline void wq(const T& x)
此部分與快讀的第一步分基本一樣,只不過多了個(gè) const
. const
在這里表示 x
在此函數(shù)內(nèi)不可被更改,這樣就可以寫類似這樣的代碼 wq(1)
wq(a + b)
.
T t = x;static char _wq_buffer[39];int bp = -1;
因?yàn)?x
不可變,所以復(fù)制了一份給 t
,下面關(guān)于 x
的操作一律用 t
代替.
static
在這里表示靜態(tài)的,相當(dāng)于在全局定義 _wq_buffer
. 給 buffer
加 _wq_
這個(gè)前綴是為了避免和其他的關(guān)鍵字沖突. \(39\) 是 __uint128_t
的十進(jìn)制下最大位數(shù)( \(2^{127} - 1 = 340282366920938463463374607431768211455\) \(39\) 位),如果需要的話可以開更多位.
bp
是 _wq_buffer
當(dāng)前的有效位數(shù)的位置,這里初始值為 \(-1\) 是為了下面方便計(jì)算.
if(!t) { putchar("0"); return;}if(t < 0) putchar("-"), t = -t;
特判一些情況,但是直接 -t
的會(huì)導(dǎo)致像 \(-128\) \(-65536\) \(\cdots\) \(-2^{8 \times \text{sizeof(T)}}\) 這樣的數(shù)會(huì)輸出亂碼.
while(t){ _wq_buffer[++bp] = t % 10 + "0"; t /= 10;}
每次取 t
的個(gè)位,然后轉(zhuǎn)化為數(shù)字字符倒序存到 _wq_buffer
里,直到 t = 0
.
for(int i = bp; i >= 0; i--) putchar(_wq_buffer[i]);
輸出,因?yàn)槭堑剐虼?,所以要倒著輸?
參考文獻(xiàn)函數(shù)模板
pathenon. isdigit()極品實(shí)現(xiàn).
戀喵大鯉魚. C++ inline 函數(shù)簡介
標(biāo)簽:
快讀快寫原理詳解[TOC]C++的`cin``cout`和C的`scanf``printf`等IO函數(shù)
2023-07-29摘要:帕金森病和老年癡呆是老年人中常見的兩種神經(jīng)退行性疾病,二
2023-07-29北京市防汛辦提示:據(jù)目前氣象預(yù)報(bào),29日晚至31日,我市有大到暴雨,局
2023-07-29國家衛(wèi)生健康委:提高母嬰設(shè)施配置率-在改善母乳喂養(yǎng)支持環(huán)境方面,通
2023-07-29天府融媒·四川新聞網(wǎng)(黃成群曾浩洋劉亞宇)7月28日,成都第31屆世界
2023-07-29命運(yùn)方舟這是一款不錯(cuò)的游戲,現(xiàn)在很多網(wǎng)友都在玩,微安卓小編注意到不
2023-07-297月28日,中自科技(688737)融資買入79 86萬元,融資償還102 62萬元,
2023-07-29大眾網(wǎng)記者孟祥新棗莊報(bào)道7月27日,“網(wǎng)絡(luò)同心文明同行”第三屆山東網(wǎng)
2023-07-291、不會(huì)。2、種植的頭發(fā)是后枕部的毛囊,而后枕部毛囊屬于不受荷爾蒙、
2023-07-2907月28日,依頓電子被滬股通減持9 79萬股,已連續(xù)3日被滬股通減持,共
2023-07-29吃了20年的無花果,今天才知道原來無花果也在吃我們,建議了解。哈嘍,
2023-07-29生活中大部分的媽媽都會(huì)照顧兒子的起居,很多事情許多媽媽會(huì)過度關(guān)心,
2023-07-29省委十三屆三次全會(huì)對加快推進(jìn)新型工業(yè)化作出重大部署,強(qiáng)調(diào)堅(jiān)持把發(fā)展
2023-07-291、桌面屬性顏色質(zhì)量16中位高級里的適配器列出所有模式800 600增強(qiáng)色16
2023-07-291、霍金傳Hawking(2004)導(dǎo)演:菲利普·馬丁編劇:彼得·莫法特主演:本尼
2023-07-291、蘋果煲湯可以放一些銀耳百合白梨冰糖。2、將蘋果和銀耳百合洗凈,蘋
2023-07-28直播吧7月28日訊據(jù)媒體人所羅門的臣仆報(bào)道,同曦男籃已將皮特森的優(yōu)先
2023-07-28格隆匯7月28日丨康華生物(300841 SZ)公布,公司于2023年7月27日收到股
2023-07-2801:46全媒體記者卜嵐實(shí)習(xí)生龍思言吳一純長沙有沒有江景現(xiàn)房公寓?最好
2023-07-28廣東省防汛防旱防風(fēng)總指揮部決定于7月28日17時(shí)結(jié)束防風(fēng)Ⅳ級應(yīng)急響應(yīng)
2023-07-28隨著一部部優(yōu)秀的影視作品呈現(xiàn)在觀眾面前,預(yù)示著影視行業(yè)的發(fā)展和進(jìn)步
2023-07-28本周焦企焦炭庫存29 6萬噸,環(huán)比減少4 8萬噸,降幅14 0%。焦企焦煤庫存
2023-07-28《博德之門3》作為今年最受玩家期待的游戲之一,確實(shí)有著非常高的關(guān)注
2023-07-287月28日,由中華全國總工會(huì)主辦的匠心筑夢技能報(bào)國第二屆大國工匠創(chuàng)新
2023-07-28小櫻師從木葉三忍中的綱手,習(xí)得百豪之術(shù),并且成為了醫(yī)療忍者救死扶傷
2023-07-28奧浦邁7月28日披露投資者關(guān)系活動(dòng)記錄表顯示,公司已經(jīng)在海外市場布局
2023-07-28邯山區(qū)河沙鎮(zhèn)鎮(zhèn)賀莊村屬于邯鄲市邯山區(qū)東部邊緣村,東靠團(tuán)結(jié)西干渠,南
2023-07-28外交部:中俄合作不針對第三方也不受第三方的干擾和脅迫---7月28日,外
2023-07-28近日,自然資源部公布了2023年自然資源科普講解大賽、科普微視頻大賽和
2023-07-28即將登場的這三大怪獸是魔斯拉、拉頓和基多拉,下面分別介紹,其中舊版
2023-07-28“保健品”是毒藥?湖北襄城警方破獲一起銷售假藥案---通訊員周胤伍徐
2023-07-287月28日,在74臺(tái)液壓提升機(jī)共同發(fā)力下,由中鐵建設(shè)、中鐵十一局集團(tuán)聯(lián)
2023-07-28無論是甜寵還是江湖,新古裝劇都不約而同打出了勵(lì)志、成長、傳統(tǒng)文化、
2023-07-28國際寵物托運(yùn)公司,寵物托運(yùn)公司哪家好這個(gè)很多人還不知道,現(xiàn)在讓我們
2023-07-28和田白玉光燈下顯黃是指和田白玉在光線照射下呈現(xiàn)出一種黃色的現(xiàn)象。和
2023-07-28這是日本和韓國最大的危機(jī),又有兩個(gè)壞消息傳來,日本,韓國,美國,李光耀
2023-07-28曾幾何時(shí),三五好友只要一坐下,房子都是繞不開的話題。從2016年始,經(jīng)
2023-07-28周五亞市WTI油價(jià)交投于79 40美元關(guān)口附近。受樂觀的美國經(jīng)濟(jì)數(shù)據(jù)和供應(yīng)
2023-07-28來源:TechWeb近日,華大九天的可靠性分析工具EmpyreanPolas?獲ISO262
2023-07-28據(jù)業(yè)者估算,臺(tái)積電2023年CoWoS總產(chǎn)能逾12萬片,2024年將沖上24萬片。
2023-07-28很多玩家想知道逆水寒游戲中《逆水寒》老兵服南海探秘攻略,本站搜集了
2023-07-28Block粉絲最愛的卡羅(Caro)和金吉·塔哈納(KingiTahana)在展示了他們的
2023-07-28王佑碩許佳琪的影評初吻在拍攝電視劇《如意芳霏》時(shí)獻(xiàn)給了王佑碩。王佑
2023-07-28導(dǎo)讀1、你那句是正確的,ryuu少了一個(gè)u,是發(fā)長音的。2、東京喰鬼里的g
2023-07-28全媒體記者陳向革通訊員劉聰超7月27日,臥龍區(qū)自然資源局深入北控南陽
2023-07-28原標(biāo)題:六部門:從嚴(yán)從緊控制現(xiàn)代煤化工產(chǎn)能規(guī)模記者27日獲悉,國家發(fā)
2023-07-281、賬號nishishabi。2、密碼250941。本文就為大家分享到這里,希望看了
2023-07-28來為大家解答以上的問題。我的世界村民建房子模組,我的世界村民怎么建
2023-07-271905電影網(wǎng)訊近日,恐怖喜劇片《殺人樹懶》發(fā)布海報(bào),北美定檔8月30日
2023-07-27天津北方網(wǎng)訊:日前,教育部公布2022年高等教育國家級教學(xué)成果獎(jiǎng),天津
2023-07-27昨晚,在新加坡T2鉆石賽第二站的決賽中,女子單打這一場比賽,非常引人
2023-07-27圖片侵刪哈嘍啊,大家晚上好~我來更新啦,抱歉讓大家久等了……(>﹏<)
2023-07-27貝殼財(cái)經(jīng)訊(記者許諾)7月26日-27日,2023全國專精特新中小企業(yè)大會(huì)
2023-07-27晏子的故事20字左右,晏子的故事這個(gè)很多人還不知道,現(xiàn)在讓我們一起來
2023-07-27讓3640萬中國人深夜熱辣流汗的APP,9年后的今天發(fā)生了巨變!,app,健身,
2023-07-27中國銀行東明城中支行崔玉梅:不待揚(yáng)鞭自奮蹄,東明,城中,王丹,山東,崔
2023-07-27關(guān)于“循環(huán)經(jīng)濟(jì)關(guān)鍵技術(shù)與裝備”重點(diǎn)專項(xiàng)2023年度指南通過首輪評審的項(xiàng)
2023-07-27今天中職招生網(wǎng)給同學(xué)們分享2023年天津市具有招生資質(zhì)中等職業(yè)學(xué)校名單
2023-07-27project2010橫道圖教程,project2010激活碼這個(gè)很多人還不知道,現(xiàn)在讓
2023-07-277月12日,同方全球人壽2023年客服節(jié)在江蘇南京正式拉開帷幕。江蘇保險(xiǎn)
2023-07-27把生態(tài)優(yōu)勢轉(zhuǎn)化為鄉(xiāng)村振興的引擎。近日,國家生態(tài)縣泰順又有大動(dòng)作——
2023-07-27深圳新聞網(wǎng)2023年7月24日訊(記者賀靛婧通訊員方貴梅)無償獻(xiàn)血拯救生
2023-07-27周明陽對于化工行業(yè)而言,2023年注定是艱難的一年。在需求走弱和產(chǎn)能過
2023-07-27SNK的《侍魂2》中的角色娜可露露的1 12Q版手辦現(xiàn)在正在進(jìn)行大促銷。原
2023-07-27撰文|三三6月19日,趣丸集團(tuán)再次向港交所遞上招股書,一月有余,暫無進(jìn)
2023-07-277月初,國家稅務(wù)總局四川省稅務(wù)局創(chuàng)新推出首批73項(xiàng)稅費(fèi)服務(wù)線下“全省
2023-07-27不動(dòng)產(chǎn)與空間服務(wù):時(shí)移勢遷行業(yè)投資當(dāng)別開生面
2023-07-27當(dāng)前,上市公司上半年業(yè)績成為投資者關(guān)注的焦點(diǎn),已有不少上市公司發(fā)布
2023-07-27揚(yáng)州網(wǎng)訊(通訊員殘聯(lián)萱記者邱凌)“和大家一起運(yùn)動(dòng),非??鞓?!”7月2
2023-07-27【成都大運(yùn)會(huì)來了】光明日報(bào)記者?周洪雙?光明日報(bào)通訊員?劉飛蜿蜒的
2023-07-27光明日報(bào)記者?常河?光明日報(bào)通訊員?田超7月18日的理論課結(jié)束后,安
2023-07-277月27日,據(jù)BWF世界羽聯(lián):2023年日本羽毛球公開賽次輪賽況何冰嬌21-122
2023-07-27茌平區(qū)融媒體中心官方微信號話說茌平地名播?音:周超?魏蕾???樂平
2023-07-121、到不了歌手:范瑋琪作曲:張洪量你眼睛會(huì)笑彎成一條橋終點(diǎn)卻是我永
2023-07-12記者從黑龍江省招生考試院獲悉,11日,2023年黑龍江省高考本科提前批院
2023-07-127月11日晚間,禾川科技發(fā)布公告稱,向不特定對象發(fā)行可轉(zhuǎn)債申請獲上交
2023-07-127月11日,易方達(dá)遠(yuǎn)見成長混合A最新單位凈值為1 1585元,累計(jì)凈值為1 15
2023-07-12分析了幾分鐘,接通語音,我說,從奇門盤上看,你們在六月份的時(shí)候
2023-07-12據(jù)澎湃新聞報(bào)道,近日,浙江省教育廳等九部門印發(fā)《浙江省青少年學(xué)生“
2023-07-1207月11日,斯達(dá)半導(dǎo)被滬股通減持萬股,已連續(xù)5日被滬股通減持,共計(jì)萬
2023-07-12貴廣網(wǎng)絡(luò)在互動(dòng)平臺(tái)表示,公司目前為貴州村BA提供直播信號傳輸支持,正
2023-07-12金融界7月12日消息日經(jīng)225指數(shù)高開0 2%,報(bào)32280 05點(diǎn);東證指數(shù)高開0
2023-07-12線上“云參展”企業(yè)突破2000家,展品超1萬件,境外參展企業(yè)遍及60多個(gè)
2023-07-127月11日,博時(shí)價(jià)值增長混合最新單位凈值為1 014元,累計(jì)凈值為3 559元
2023-07-12小米手環(huán)恢復(fù)出廠設(shè)置別人還能找到嗎小米手環(huán)堪稱智能手環(huán)里的畢業(yè)款,
2023-07-121、輸入“地名”+“交警”百度,選擇當(dāng)?shù)亟痪墓倬W(wǎng),現(xiàn)在官網(wǎng)都提供查
2023-07-117月10日,陳奕迅在中國香港跟數(shù)百歌迷聚會(huì)。香港歌迷提早為他慶祝生日
2023-07-112023年上半年,我國新能源汽車產(chǎn)銷量分別達(dá)378 8萬輛和374 7萬輛。
2023-07-11挖貝網(wǎng)7月11日,誠昊啟元(870724)的持續(xù)督導(dǎo)主辦券商開源證券近日發(fā)
2023-07-11實(shí)習(xí)記者徐暢7月11日,臨沂市人民政府新聞辦公室召開新聞發(fā)布會(huì)。記者
2023-07-11在私人數(shù)字貨幣發(fā)展的同時(shí),一方面,各國中央銀行也紛紛試水主權(quán)數(shù)字貨
2023-07-11日前,特斯拉中國消息,特斯拉Cyberquad玩具車將于7月14日上市,官方售
2023-07-11日前,重慶移通學(xué)院藝術(shù)傳媒學(xué)院組織近40名志愿者實(shí)踐團(tuán)前往合川區(qū)渭沱
2023-07-11中國網(wǎng)7月11日訊為深入貫徹落實(shí)黨的二十大精神,復(fù)制推廣各地已形成的
2023-07-11中國日報(bào)7月11日電(記者杜娟攝影張威)7月11日上午10點(diǎn),隨著國產(chǎn)最大
2023-07-11文、圖 羊城晚報(bào)全媒體記者詹翔閔通訊員陳子楷7月10日,一場氣氛超“燃
2023-07-11東鵬控股公布2023年半年度業(yè)績預(yù)告,歸屬于上市公司股東的凈利潤億元–
2023-07-11據(jù)新華社,圣地亞哥消息:聯(lián)合國拉丁美洲和加勒比經(jīng)濟(jì)委員會(huì)(拉加經(jīng)委
2023-07-11新京報(bào)貝殼財(cái)經(jīng)訊(記者于夢兒)7月10日,新京報(bào)貝殼財(cái)經(jīng)記者從上海市
2023-07-11新華社巴黎7月10日電(記者張百慧)法國政府10日宣布啟動(dòng)“未來網(wǎng)絡(luò)”
2023-07-11Copyright © 2015-2022 太平洋水產(chǎn)網(wǎng)版權(quán)所有 備案號:豫ICP備2022016495號-17 聯(lián)系郵箱:93 96 74 66 9@qq.com