初探c++11之for循環篇


在很多語言中都有類似foreach之類的循環關鍵字。在C++11中,也添加了類似的語言特性。

不過,這里首先說一句,在STL已經有類似的東西,std::for_each,感興趣可以自己查一下,這里不贅述。

 

首先,給出一個參考文檔

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2930.html

 

其次,給出一個示例

1 int array[5] = { 1, 2, 3, 4, 5 };
2 for (int& x : array)
3 x *= 2;

這樣我們可以看到它的大概用法。值得注意的是,這里的循環變量是一個引用,這樣可以在循環過程中改變它的值。

 

那么,接下來會有幾個疑問。第一,這種for循環的標准形式是什么。第二,這個示例給出的是一個數組的例子。但是類似數組的,還有stl里面的那些容器,在那上面可以用這種表達形式嗎?第三,這個示例中for循環中的array是一個數組,也就是是指針常量,那么如果這里array是一個指針變量可以嗎?

 

首先,對於第一個問題,它的標准形式如下

for ( for-range-declaration : expression ) statement

for-range-declaration:
     type-specifier-seq attribute-specifieropt declarator
也就是說,for循環中冒號后面的一項是一個表達式。通過查閱前面給出的參考文檔,這個表達式應該或者是一個數組,或者是一個擁有begin()和end()方法的對象。

 

對於第二個問題,vector, list之類的stl容器都是可以的。只要是有begin()和end()方法的對象都可以。那么,這么說,我們自己寫一個類,有begin()和end()方法都可以嗎?當然,這里要求begin()和end()方法返回兩個可以比較的對象,並且支持*,++和!=三種操作。

到這里,我們應該寫一些代碼測試一下。可是,我這里現在只有visual studio 2010,而它有不支持這個特性……只能等回頭建立個gcc的環境來測試了。

 

對於第三個問題,答案是不可以的。如果這個參數是數組,則必須要知道它的大小。而一個指針變量是無法知道大小的。在參考文檔中是這么寫的,If _RangeTis an array of unknown size or an array of incomplete type, the program is ill-formed.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM