標籤:

leetcode里這段強行加快運行速度的C++代碼是什麼意思?

能感覺到通過這個提高速度是很無聊的行為,但是這些代碼是什麼原理啊,我應該在學什麼知識的時候會學到這些函數呢? 為什麼是個int類型的。。。。

static int x = []() {

std::ios::sync_with_stdio(false);

cin.tie(NULL);

return0; }();


main函數前執行代碼的技巧,不過這樣寫其實是不好的,因為你的代碼可能會在stl初始化之前跑,然後GG


默認的時候,cin與stdin總是保持同步的,不必擔心文件指針混亂,同時cout和stdout也一樣,也是默認保持同步,這導致了cin有額外的開銷,所以會更花時間。

當使用了:

std::ios::sync_with_stdio(false);

就是關閉了cin與stdin的同步,所以效率會和scanf相差無幾

可以參考一下byvoid的文章:

探尋C++最快的讀取文件的方案 - BYVoid?

www.byvoid.com


你可以去看《C++ Primer》第五版中文版學到這些知識。

這是一個 lambda 函數,剛開始可能會覺得這種寫法很詭異,特別是很多函數嵌套的時候,參數是函數,返回值也是函數。這就成了函數式編程風格。

輪子哥說人一生最少要學20種語言,推薦必學的4種是 C++、Haskell、Ruby、Prolog。分別為編譯型、函數式、動態型、邏輯型。

所以,學無止境,多看書。


並不無聊,cin為了與scanf混用,加了綁定,這就導致輸出變慢

在大規模的輸入輸出情況下,解綁定可以提高速度10倍左右,當然更快的是fopen,不過leetcode是io流的


分析一下這段代碼

首先從[]() {

......

}

這段,是個lamda表達式,可以把它理解為一個函數,如果用auto fun =上面那段代碼,那auto的值相當於是個function。

重點在於這個lamda後面跟著的();,我們把lamda用fun保存下來的話,那麼後面跟個括弧就相當於fun();,也就相當於調用了這個函數,那麼它將會執行這個函數,並將返回值返回,所以static int x就相當於保存了這個函數的返回值。


使用靜態變數先於主函數初始化的特性強制在main之前關掉cout的同步


關閉同步,強行刷緩衝,速度一般來說和scanf差不多了。


leetcode不是不用io嘛....


也就刷龐大io數據的acm題用得上這種技巧吧


流加速

演算法競賽入門經典裡面提到了

關閉和 stdio的同步

記得洛谷上面我用了這個卡秒過了一道題

用了這個就別用什麼 printf 了,提交就WA……

(慘痛的教訓


這個不無聊吧,刷題有時會用。和int沒一點關係。重要的是後面的函數。其次,這樣寫就像輪子哥說的。會出錯。裡面核心的就是關閉個功能。但不如c的那個快。這個優化效果很好,對於刷題


關閉與C的IO流同步來加快速度


是一個lambda,調用了的,所以那個int是函數返回值的類型


推薦閱讀:

當前工作用的最熱門的Windows可視化編程是什麼 類似MFC這種的?
C++ 嵌套類類模板特化 error: explicit specialization?
C++域作用符在函數聲明和定義中的意義?
為什麼現在有很多人甚至大學授課還在堅持VC6?
記得不止一個人說學完c語言,再學c++會把c語言里不好的東西帶進學c++中,那麼請問具體有什麼東西?

TAG:CC | LeetCode領扣 |