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循环的特点,就可以方便的分析每次迭代的结果,提前避免算法的错误。

+
原文地址:https://www.cnblogs.com/gtarcoder/p/4803060.html