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

    +
  • 相关阅读:
    [bzoj1468]Tree(点分治)
    [bzoj1087]: [SCOI2005]互不侵犯King(状压dp)
    [hdu5628]Clarke and math(dirichlet卷积)
    [bzoj1036]:[ZJOI2008]树的统计Count(树链剖分)
    [bzoj1026][SCOI2009]windy数(前缀和+数位dp)
    洛谷 P1714 切蛋糕(dp+RMQ)
    [hdu3507] Print Article
    [bzoj1597]: [Usaco2008 Mar]土地购买
    php基础二
    php基础
  • 原文地址:https://www.cnblogs.com/gtarcoder/p/4803060.html
Copyright © 2011-2022 走看看