• C++11学习笔记(1) Rangebased for loop


    郑重声明:本文是笔者根据个人理解所写,错误难免,欢迎拍砖!

           可以任意转载、修改,转载时是否标明出处,随君而定!

      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

  • 相关阅读:
    I B
    让Xcode的控制台支持LLDB类型的打印
    UINavigationController和UIScrollView一起使用时导致UIScrollView位置偏移
    C语言中如何用printf函数输出百分号?
    运算符的优先级
    How To Ask Question The Smart Way
    WEB浅析(本人小白~)
    博客园的基础设置
    静态页面和动态页面的区别
    <存储小结>(待补充)
  • 原文地址:https://www.cnblogs.com/520zijuan/p/2889510.html
Copyright © 2020-2023  润新知