c++11——基於范圍的for循環


 c++11中有基於范圍的for循環,基於范圍的for循環可以不再關心迭代器的概念,只需要關系容器中的元素類型即可,同時也不必顯式的給出容器的開頭和結尾。

int arr[] = {1, 2, 3, 4};
for(int a : arr){
...
}

vector<string> str_arr{"hello", "world", "fuck"};
for(auto v : str_arr){
...
}

如果希望修改容器中的元素,則可以使用引用類型:
for(auto& v: arr){
....
}

 

    在使用基於范圍的for循環的時候,還需要注意容器本身的一些約束。比如

由於set和map中的元素存放為有很強的大小順序,因此不能隨便修改他們的值
std::set<int> s = {1, 2, 3};
for(auto& val: s){
    std::cout << val ++ << endl;    //出錯,由於std::set中的內部元素是只讀的,因此for循環的auto會被自動推導為 const int&
}

 

    注意基於范圍的for循環的for機制,基於范圍的for循環一般在循環開始之前就確定好迭代的范圍,而不是在每次迭代之前去調用一次arr.end().

std::vector<int> arr = {1, 2, 3, 4, 5};
for(int a : arr){
    ...
}
相當於
auto && __range = (arr);
for(auto __begin = __range.begin(), __end = __range.end(); __begin != __end; ++__begin){
    ...
}

 

    盡量不要在迭代的過程中修改迭代的容器,但是在不得不這樣做的時候,通過理解基於范圍的for循環的特點,就可以方便的分析每次迭代的結果,提前避免算法的錯誤。

+


免責聲明!

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



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