C++输入输出:cin/cout 还是 scanf/printf?
相信使用C++的人都有一種迷惑或者是不自信:在輸入輸出的時(shí)候是不是應(yīng)該使用scanf/printf更好呢,因?yàn)閭髡f(shuō)cin/cout龜速,我當(dāng)時(shí)也長(zhǎng)期被這個(gè)所困擾,后來(lái)在閱讀C++ primer第五版的時(shí)候我自己做了一個(gè)測(cè)試,發(fā)現(xiàn)如果不使用std::ios_sync_with_stdio(false);關(guān)閉和C庫(kù)函數(shù)的同步的話的確scanf/printf快很多,大概相差五倍,但是如果關(guān)閉同步的話,cin/cout是比scanf/printf快8%-10%的。(這兩個(gè)數(shù)據(jù)是我后面看別人測(cè)量的,我自己只是簡(jiǎn)單測(cè)量了一下)
之所以關(guān)閉緩沖以后cin/cout比較快,是因?yàn)閏in/cout對(duì)輸入?yún)?shù)和類(lèi)型的推斷是在編譯時(shí)確定的,而scanf/printf是在運(yùn)行時(shí)確定的。
在我以前的一篇博客:C++Primer學(xué)習(xí)筆記:第1章 開(kāi)始中我提到了這一點(diǎn)。
如果認(rèn)為我自己的測(cè)量可能有誤差,可以看一下大神們的回答:
Cin-Cout vs Scanf-Printf
Using scanf() in C++ programs is faster than using cin?
和我的說(shuō)法是一致的,以后被人懟你怎么還用cin/cout的時(shí)候,你可以拿出這些測(cè)評(píng)讓他們瞧瞧,我們也應(yīng)該對(duì)C++自信起來(lái),不要想著C++沒(méi)有C底層好像速度就差一些。
但是之前參加競(jìng)賽的時(shí)候,我信心滿滿地使用cin/cout進(jìn)行輸入輸出,卻總是TEL,我以為是程序算法的問(wèn)題,檢查了好久好久,最后才發(fā)現(xiàn)是因?yàn)槭褂昧薱in/cout的原因,改成scanf/printf后程序就AC了,看到這里你是不是心里一驚:搞什么嘛,上面的測(cè)評(píng)都是唬人的嘛
其實(shí)之所以即使關(guān)閉了和C庫(kù)的同步,我的程序還會(huì)TEL和cin/cout沒(méi)有什么關(guān)系,罪魁禍?zhǔn)资莈ndl,相信很多學(xué)習(xí)C++的人都和我一樣,習(xí)慣了使用endl進(jìn)行換行,同時(shí)刷新緩沖區(qū),一舉兩得,美滋滋,但是其實(shí)正是因?yàn)閑ndl會(huì)強(qiáng)制刷新緩沖區(qū),導(dǎo)致頻繁的IO操作,使得程序效率迅速降低。因此除非是使用打樁調(diào)試(就是及時(shí)輸出調(diào)試信息,因?yàn)檫@里我們要求輸出信息有時(shí)效性,所以要及時(shí)刷新緩沖區(qū)),否則都不要使用endl,而使用\n進(jìn)行換行。
知道了這兩點(diǎn):
std::ios::sync_with_stdio(false); cout << "Hello world" << "\n";我們就可以放心地使用cin/cout進(jìn)行輸入輸出啦,而且效率肯定是最快的。
在使用cin進(jìn)行循環(huán)讀入的時(shí)候可能會(huì)遇到一點(diǎn)問(wèn)題,可以參考一下我以前寫(xiě)的一篇博客:C++ cin 實(shí)現(xiàn)循環(huán)讀入
有了上面的準(zhǔn)備,我們就可以使用cin/cout開(kāi)心地寫(xiě)代碼啦。
總結(jié)
以上是生活随笔為你收集整理的C++输入输出:cin/cout 还是 scanf/printf?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 我的继父是偶像剧情介绍
- 下一篇: C++ array初始化需要双层大括号