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循環的特點,就可以方便的分析每次迭代的結果,提前避免算法的錯誤。