鄭重聲明:本文是筆者根據個人理解所寫,錯誤難免,歡迎拍磚!
可以任意轉載、修改,轉載時是否標明出處,隨君而定!
range-for是C++ 11新增特性,用於迴圈迭代一個“範圍”,該“範圍”類似於包含有begin()和end()方法的STL序列容器。所有的STL標準容器都適用於該“範圍”,例如vector、string等等。數組也同樣可以,只要定義了begin()和end()方法的任何“範圍”都可以使用for來迴圈迭代容器裡面的元素,如istream。
文法:
for ( range_declaration : range_expression) loop_statement
上述代碼的效果類似於:
(__range, __begin and __end are for exposition only):
{ auto && __range = range_expression ; for (auto __begin = begin_expr, __end = end_expr; __begin != __end; ++__begin) { range_declaration = *__begin; loop_statement } }
range_expression被用於確定將要迭代的序列或範圍。序列中的每個元素被解引用,並賦值給由range_declaration指定的變數。
迭代器begin_expr和end_expr可以被定義成如下類型:
* 如果__range是數組,(__range) 和 (__range + __bound)表示數組的範圍
*如果__range是一個類,實現了begin()或end()方法,或者兩個方法都實現了,此時begin_expr就表示 __range.begin(),而 end_expr則表示 __range.end()。
否則begin(__range)和end(__range)將通過基於與std名稱空間關聯的參數依賴尋找規則來尋找。
如果range_expression返回一個臨時變數,它的生命週期到迴圈結束,如綁定到右值__range的,但要注意,臨時嵌套在range_expression中的並沒有延長其生命週期。
如同傳統的for語句,關鍵字break可以提前結束迴圈,而continue可以繼續迴圈。
example:
1 void f(vector<double>& v)2 {3 for (auto x : v) cout << x << '\n';4 for (auto& x : v) ++x; // 通過引用可以修改v中的值5 }
for也可以用於迭代普通的數組,如:
for (const auto x : { 1,2,3,5,8,13,21,34 }) cout << x << '\n';
誤區一:
1 int* p = new int [2];2 p[0] = 1;3 p[1] = 2;4 for (auto x : p) cout << x << endl;
編譯器會報錯誤:
錯誤:對‘begin(int*&)’的調用沒有匹配的函數
通過上面對for的介紹可以知道,for實現的機制就是依賴與容器中的begin()和end()方法。對於普通的數組,編譯器預設已經實現了類似的方法。這裡的p是一個指標,儘管它可以像數組一樣使用,但是它並沒有類似與begin()或end()的方法,當然會編譯不通過。
參考文獻:
http://www.stroustrup.com/C++11FAQ.html
http://en.cppreference.com/w/cpp/language/range-for