C++11學習筆記(1)— Range-based for loop

來源:互聯網
上載者:User

鄭重聲明:本文是筆者根據個人理解所寫,錯誤難免,歡迎拍磚!

       可以任意轉載、修改,轉載時是否標明出處,隨君而定!

  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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.