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領扣 |