1. 程式人生 > >初探c++11之for迴圈篇

初探c++11之for迴圈篇

轉自:https://www.cnblogs.com/l00l/archive/2012/02/03/2337557.html

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

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

首先,給出一個參考文件

其次,給出一個示例

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.