標籤:

C++11(VC++) 中支持多種for循環寫法,哪種比較好?

在VS2012中,以下五種使用for循環遍曆數據的方法都被允許,哪種寫法比較好?為什麼?

============== 分割線 [2015.2.12 15.06] ==============

如果把上面五種for循環分別編號為ABCDE,認可度最高的是第C種寫法。

果然「瘦」還是一如既往的重要啊!!!

那麼問題來了,除了「瘦」就沒有區別了嗎?

最重要的性能呢?

於是題主精(shun)心(shou)統計了循環150,000 × 150,000 = 22,500,000,000次所花費的時間。

每個統計了一百次啊一百次(其實就是個變數)

畫風突變的測試代碼:

Release版測試結果:

每22,500,000,000次循環加上給int賦值的時間大概是7S多一點。

結論:各種不同寫法的for之間幾乎沒有性能差別 or 性能差別極小不足以使人關注


除了 @vczh說的,補充一下C++17的一個提案,就是有關Range-based for循環的,被稱為Range for Next Generation

這個提案簡單的來說就是可以這樣寫了:

for(item : numSet)
{
// ...
}

連auto都沒有了,當然這在編譯器是完全可以做的,因為按照提案,這其實等價於auto item : numSet,不過我也不知道這個提案會不會在C++17中通過

Ref : ISO/IEC JTC1/SC22/WG21
N3994


第一個不好,萬一numSet[i]不是O(1)的呢,容器可不止vector一種。

第二個太長了。

第三個是推薦的

第四個是VC++的C++/CLI或C++/CX擴展,不過他跟第三個其實完全沒有區別,因為互相都可以用。

第五個很難講,主要是你要把整個程序寫成函數式或響應式的,用這個才有額外的好處。


就用第三個吧,不過通常不會這麼用,要麼就是const auto 要麼就是auto


補充vczh的...

最後一種等價於迭代器寫法...

除非實現了詭異的模板特化...(似乎不會有吧一般)

auto最好寫成const auto吧...不會有拷貝開銷...


這些肯定沒有什麼性能差別啊...語法糖無非是方便你輸入代碼而已,被編譯器ooxx完了以後都是一樣的...


具體場合具體用吧,現在很討厭寬泛滿足的研究,認為必然有大統一理論,尋找萬應錠,顧此失彼,最後成什麼都能做但又都做不好的四不像,還要反覆打補丁。需求既然不同怎麼能用同一種方法解決呢?除非圖省事不在乎效率。


我在我現在的項目(一款遊戲伺服器中,大量使用第三種),簡潔


C++11中有一個類似java中增強for循環的範圍for循環比較適合遍歷集合(範圍for不能增加和刪除集合元素,也就是不能改變集合大小)。其它的我還是用一般的for循環(要是在範圍for循環中用引用也可以做到一般for可以做的修改變數內容等)。不過確實auto這個關鍵字被重新賦予新意義後好多東西都簡單了。(Ps我覺得樓主的截圖是來自codeblocks)


推薦閱讀:

Visual Studio有哪些不為人知卻特別好用的實用工具/技巧/功能/特性?

TAG:C | VisualC | C11 |