两个吃奶一个添下面视频_人妻第一页香蕉网_欧美xxxx少妇_妺妺窝人体色www婷婷

看到不少初學(xué)編程的同學(xué)是學(xué)的C++,或者學(xué)了C再學(xué)C++之后,會習(xí)慣性的用C風(fēng)格的C++代碼編寫程序,因此習(xí)慣了cout、cin輸入輸出,但在默認(rèn)情況下,同樣輸入輸出語句,C語言的scanf和printf ,比C++的std::cin和std::cout 要快的多。這一點(diǎn)大家在實(shí)際做題過程中或許有所感受,比如有些題同樣的代碼,用cout cin就會超時,而用pritnf scanf就可以通過。

cin、cout 與 scanf、printf 的實(shí)際速度差會隨編譯器和操作系統(tǒng)的不同發(fā)生一定的改變。如果想要進(jìn)行詳細(xì)對比,請以實(shí)際測試結(jié)果為準(zhǔn)。


如何優(yōu)化輸入輸出?

1.取消緩沖區(qū)同步語句  std::ios::sync_with_stdio(false)

C++中cin,cout效率比較低,是因?yàn)橄劝岩敵龅臇|西存入緩沖區(qū)與C語言中的stdio同步后,再輸出,導(dǎo)致效率降低,而這個語句的作用是取消緩沖區(qū)同步,直接使用,由此可節(jié)省時間,使效率與scanf與printf相差無幾。

但需要注意的一點(diǎn)是,因?yàn)槿∠cstdio的同步之后,就不建議再使用 printf 與 scanf了,否則實(shí)際輸出效率可能還會與預(yù)期不符。只能用cin 與 cout,以使得cout和cin的效率得到提高


2.使用tie函數(shù)減少IO負(fù)擔(dān)

首先我們需要了解一個可能不知道的事實(shí),那就是C++中的cout和cin并不是獨(dú)立的,即在使用cout的時候,cin也會執(zhí)行,反之亦然。正是由于這種情況,當(dāng)我們遇到數(shù)據(jù)集超大造成 cin 超時(TLE)的時候,我們可能會認(rèn)為這是cin的效率不及scanf的原因。其實(shí)是輸入緩沖區(qū),flush緩沖區(qū),占用了時間。

tie 是將兩個 stream 綁定的函數(shù),空參數(shù)的話返回當(dāng)前的輸出流指針。如代碼:

 std::cin.tie(0)

在默認(rèn)的情況下 std::cin 綁定的是 std::cout,每次執(zhí)行 << 操作符的時候都要調(diào)用 flush() 來清理緩沖區(qū)(stream buffer),這樣會增加 IO 負(fù)擔(dān)。可以通過這句代碼std::cin.tie(0)來解除 std::cin 與 std::cout 的綁定,進(jìn)一步加快執(zhí)行效率。一個完整且簡單的例子如下:

using namespace std;
int main()
{
    int i;
    cin.tie(&cout);
    cout<<"Enter a number.";
    cin>>i;
}

用戶輸入5然后敲回車后

代碼執(zhí)行的過程是,直接將“Enter a number."輸出到控制臺上,然后直接將用戶輸入的5讀入到i中,中間不經(jīng)過緩沖區(qū)。

因此當(dāng)我們要大量讀取數(shù)據(jù)的時候可以tie函數(shù)解綁,來加快數(shù)據(jù)讀取。


但需要注意的是,在解除了 std::cin 和 std::cout 的綁定后,程序中必須手動 flush 才能確保每次 std::cout 展現(xiàn)的內(nèi)容可以在 std::cin 前出現(xiàn)。這是因?yàn)?std::cout 被 buffer 為默認(rèn)設(shè)置。例如:

std::cout<< "Please input your name: "<<std::flush;  
// 或者std::endl;  因?yàn)槊看握{(diào)用std::endl都會flush輸出緩沖區(qū),而 \n 則不會。
// 但請謹(jǐn)慎使用,過多的flush也會影響程序效率
std::cin >> name;


點(diǎn)贊(0)

C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍(lán)橋杯競賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點(diǎn)擊了解:

一點(diǎn)編程也不會寫的:零基礎(chǔ)C語言學(xué)練課程

解決困擾你多年的C語言疑難雜癥特性的C語言進(jìn)階課程

從零到寫出一個爬蟲的Python編程課程

只會語法寫不出代碼?手把手帶你寫100個編程真題的編程百練課程

信息學(xué)奧賽或C++選手的 必學(xué)C++課程

藍(lán)橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競賽課入門課程

手把手講解近五年真題的藍(lán)橋杯輔導(dǎo)課程

Dotcpp在線編譯      (登錄可減少運(yùn)行等待時間)